AUTHORS0000664000175000017500000000004112067326706012010 0ustar patrickpatrickPatrick Ulbrich Basenji/0000775000175000017500000000000012067326706012320 5ustar patrickpatrickBasenji/app.desktop0000664000175000017500000000035712067326706014500 0ustar patrickpatrick[Desktop Entry] Type=Application Name=Basenji Exec=basenji Terminal=false Icon=@expanded_datadir@/@PACKAGE@/basenji.svg Categories=Utility; Comment=A portable volume indexer. Comment[de]=Ein portierbares Datenträger-Indizierungswerkzeug. Basenji/basenji.in0000664000175000017500000000355312067326706014271 0ustar patrickpatrick#!/bin/bash # Import GNOME 3 thumbnailers into GConf. # Workaround for bug lp:864615. # https://bugs.launchpad.net/ubuntu/+source/gconf2/+bug/864615 function check_thumbnailers() { THUMBNAILER_DIR=/usr/share/thumbnailers GCONF_PATH=/desktop/gnome/thumbnailers if [ $(gconftool-2 --all-dirs $GCONF_PATH | wc -l) -gt 0 ]; then # All good - thumbnailers are available in GConf return fi if [ ! -d $THUMBNAILER_DIR ]; then echo "Error: Can't import thumbnailers - directory '$THUMBNAILER_DIR' not found." return fi echo "Importing thumbnailers into GConf..." cnt=0 commands= mimetypes= for f in $(ls $THUMBNAILER_DIR); do echo "* Importing $f" cmd=$(grep -w Exec "$THUMBNAILER_DIR/$f" | cut -d '=' -f2) mimestr=$(grep -w MimeType "$THUMBNAILER_DIR/$f" | cut -d '=' -f2) for m in $( echo $mimestr | tr ";" "\n"); do commands[$cnt]=$cmd mimetypes[$cnt]=$(echo $m | tr "/" "@" | tr "+" "@") ((cnt++)) done done echo "* Writing to GConf" entries= for (( i = 0 ; i < ${#mimetypes[@]} ; i++ )); do read -d '' entry < ${mimetypes[$i]}/command /schemas$GCONF_PATH/${mimetypes[$i]}/command ${commands[$i]} ${mimetypes[$i]}/enable /schemas$GCONF_PATH/${mimetypes[$i]}/enable true EOF entries=$entries$entry done read -d '' xml < disable_all /schemas$GCONF_PATH/disable_all false $entries EOF echo $xml | gconftool-2 --load - echo "Done." } check_thumbnailers cd "@expanded_libdir@/@PACKAGE@" exec mono Basenji.exe "$@" Basenji/Makefile0000664000175000017500000003211212067326706013757 0ustar patrickpatrick EXTRA_DIST = $(srcdir)/custom-hooks.make Makefile # Warning: This is an automatically generated file, do not edit! srcdir=. top_srcdir=.. include $(top_srcdir)/config.make ifeq ($(CONFIG),DEBUG) ASSEMBLY_COMPILER_COMMAND = dmcs ASSEMBLY_COMPILER_FLAGS = -noconfig -codepage:utf8 -warn:3 -optimize- -debug "-define:DEBUG" ASSEMBLY = bin/Debug/Basenji.exe ASSEMBLY_MDB = $(ASSEMBLY).mdb COMPILE_TARGET = winexe PROJECT_REFERENCES = \ ../Platform/bin/Debug/Platform.dll \ ../VolumeDB/bin/Debug/VolumeDB.dll BUILD_DIR = bin/Debug BASENJI_EXE_MDB_SOURCE=bin/Debug/Basenji.exe.mdb BASENJI_EXE_MDB=$(BUILD_DIR)/Basenji.exe.mdb BASENJI_EXE_CONFIG_SOURCE=Basenji.exe.config PLATFORM_DLL_SOURCE=../Platform/bin/Debug/Platform.dll PLATFORM_DLL_CONFIG_SOURCE=../Platform/Platform.dll.config PLATFORM_DLL_MDB_SOURCE=../Platform/bin/Debug/Platform.dll.mdb PLATFORM_DLL_MDB=$(BUILD_DIR)/Platform.dll.mdb VOLUMEDB_DLL_SOURCE=../VolumeDB/bin/Debug/VolumeDB.dll PLATFORM_COMMON_DB_DLL_SOURCE=../Platform.Common.DB/bin/Debug/Platform.Common.DB.dll PLATFORM_COMMON_DB_DLL_MDB_SOURCE=../Platform.Common.DB/bin/Debug/Platform.Common.DB.dll.mdb PLATFORM_COMMON_DB_DLL_MDB=$(BUILD_DIR)/Platform.Common.DB.dll.mdb MUSICBRAINZ_DLL_SOURCE=../MusicBrainz/bin/Debug/MusicBrainz.dll MUSICBRAINZ_DLL_MDB_SOURCE=../MusicBrainz/bin/Debug/MusicBrainz.dll.mdb MUSICBRAINZ_DLL_MDB=$(BUILD_DIR)/MusicBrainz.dll.mdb VOLUMEDB_DLL_MDB_SOURCE=../VolumeDB/bin/Debug/VolumeDB.dll.mdb VOLUMEDB_DLL_MDB=$(BUILD_DIR)/VolumeDB.dll.mdb endif ifeq ($(CONFIG),RELEASE) ASSEMBLY_COMPILER_COMMAND = dmcs ASSEMBLY_COMPILER_FLAGS = -noconfig -codepage:utf8 -warn:3 -optimize+ ASSEMBLY = bin/Release/Basenji.exe ASSEMBLY_MDB = COMPILE_TARGET = winexe PROJECT_REFERENCES = \ ../Platform/bin/Release/Platform.dll \ ../VolumeDB/bin/Release/VolumeDB.dll BUILD_DIR = bin/Release BASENJI_EXE_MDB= BASENJI_EXE_CONFIG_SOURCE=Basenji.exe.config PLATFORM_DLL_SOURCE=../Platform/bin/Release/Platform.dll PLATFORM_DLL_CONFIG_SOURCE=../Platform/Platform.dll.config PLATFORM_DLL_MDB= VOLUMEDB_DLL_SOURCE=../VolumeDB/bin/Release/VolumeDB.dll PLATFORM_COMMON_DB_DLL_SOURCE=../Platform.Common.DB/bin/Release/Platform.Common.DB.dll PLATFORM_COMMON_DB_DLL_MDB= MUSICBRAINZ_DLL_SOURCE=../MusicBrainz/bin/Release/MusicBrainz.dll MUSICBRAINZ_DLL_MDB= VOLUMEDB_DLL_MDB= endif ifeq ($(CONFIG),GNOME_DEBUG) ASSEMBLY_COMPILER_COMMAND = dmcs ASSEMBLY_COMPILER_FLAGS = -noconfig -codepage:utf8 -warn:3 -optimize- -debug "-define:DEBUG" ASSEMBLY = bin/Debug/Basenji.exe ASSEMBLY_MDB = $(ASSEMBLY).mdb COMPILE_TARGET = winexe PROJECT_REFERENCES = \ ../Platform/bin/Debug/Platform.dll \ ../VolumeDB/bin/Debug/VolumeDB.dll BUILD_DIR = bin/Debug BASENJI_EXE_MDB_SOURCE=bin/Debug/Basenji.exe.mdb BASENJI_EXE_MDB=$(BUILD_DIR)/Basenji.exe.mdb BASENJI_EXE_CONFIG_SOURCE=Basenji.exe.config PLATFORM_DLL_SOURCE=../Platform/bin/Debug/Platform.dll PLATFORM_DLL_CONFIG_SOURCE=../Platform/Platform.dll.config PLATFORM_DLL_MDB_SOURCE=../Platform/bin/Debug/Platform.dll.mdb PLATFORM_DLL_MDB=$(BUILD_DIR)/Platform.dll.mdb VOLUMEDB_DLL_SOURCE=../VolumeDB/bin/Debug/VolumeDB.dll PLATFORM_COMMON_DB_DLL_SOURCE=../Platform.Common.DB/bin/Debug/Platform.Common.DB.dll PLATFORM_COMMON_DB_DLL_MDB_SOURCE=../Platform.Common.DB/bin/Debug/Platform.Common.DB.dll.mdb PLATFORM_COMMON_DB_DLL_MDB=$(BUILD_DIR)/Platform.Common.DB.dll.mdb MUSICBRAINZ_DLL_SOURCE=../MusicBrainz/bin/Debug/MusicBrainz.dll MUSICBRAINZ_DLL_MDB_SOURCE=../MusicBrainz/bin/Debug/MusicBrainz.dll.mdb MUSICBRAINZ_DLL_MDB=$(BUILD_DIR)/MusicBrainz.dll.mdb VOLUMEDB_DLL_MDB_SOURCE=../VolumeDB/bin/Debug/VolumeDB.dll.mdb VOLUMEDB_DLL_MDB=$(BUILD_DIR)/VolumeDB.dll.mdb endif ifeq ($(CONFIG),GNOME_RELEASE) ASSEMBLY_COMPILER_COMMAND = dmcs ASSEMBLY_COMPILER_FLAGS = -noconfig -codepage:utf8 -warn:3 -optimize+ ASSEMBLY = bin/Release/Basenji.exe ASSEMBLY_MDB = COMPILE_TARGET = winexe PROJECT_REFERENCES = \ ../Platform/bin/Release/Platform.dll \ ../VolumeDB/bin/Release/VolumeDB.dll BUILD_DIR = bin/Release BASENJI_EXE_MDB= BASENJI_EXE_CONFIG_SOURCE=Basenji.exe.config PLATFORM_DLL_SOURCE=../Platform/bin/Release/Platform.dll PLATFORM_DLL_CONFIG_SOURCE=../Platform/Platform.dll.config PLATFORM_DLL_MDB= VOLUMEDB_DLL_SOURCE=../VolumeDB/bin/Release/VolumeDB.dll PLATFORM_COMMON_DB_DLL_SOURCE=../Platform.Common.DB/bin/Release/Platform.Common.DB.dll PLATFORM_COMMON_DB_DLL_MDB= MUSICBRAINZ_DLL_SOURCE=../MusicBrainz/bin/Release/MusicBrainz.dll MUSICBRAINZ_DLL_MDB= VOLUMEDB_DLL_MDB= endif AL=al SATELLITE_ASSEMBLY_NAME=$(notdir $(basename $(ASSEMBLY))).resources.dll PROGRAMFILES = \ $(BASENJI_EXE_MDB) \ $(BASENJI_EXE_CONFIG) \ $(PLATFORM_DLL) \ $(PLATFORM_DLL_CONFIG) \ $(PLATFORM_DLL_MDB) \ $(VOLUMEDB_DLL) \ $(PLATFORM_COMMON_DB_DLL) \ $(PLATFORM_COMMON_DB_DLL_MDB) \ $(MUSICBRAINZ_DLL) \ $(MUSICBRAINZ_DLL_MDB) \ $(VOLUMEDB_DLL_MDB) LINUX_DESKTOPAPPLICATIONS = \ $(BASENJI_DESKTOP) BINARIES = \ $(BASENJI) RESGEN=resgen2 BASENJI_DESKTOP = $(BUILD_DIR)/basenji.desktop BASENJI = $(BUILD_DIR)/basenji BASENJI_EXE_CONFIG = $(BUILD_DIR)/Basenji.exe.config PLATFORM_DLL = $(BUILD_DIR)/Platform.dll PLATFORM_DLL_CONFIG = $(BUILD_DIR)/Platform.dll.config VOLUMEDB_DLL = $(BUILD_DIR)/VolumeDB.dll PLATFORM_COMMON_DB_DLL = $(BUILD_DIR)/Platform.Common.DB.dll MUSICBRAINZ_DLL = $(BUILD_DIR)/MusicBrainz.dll FILES = \ src/Gui/About.cs \ src/Gui/DBProperties.cs \ src/Gui/DriveSelection.cs \ src/Gui/Events.cs \ src/Gui/ItemSearch.cs \ src/Gui/MainWindow.cs \ src/Gui/Preferences.cs \ src/Gui/VolumeProperties.cs \ src/Gui/VolumeScanner.cs \ src/Gui/Base/BinBase.cs \ src/Gui/Base/DialogBase.cs \ src/Gui/Base/ViewBase.cs \ src/Gui/Base/WindowBase.cs \ src/Gui/Widgets/DateChooser.cs \ src/Gui/Widgets/ItemInfo.cs \ src/Gui/Widgets/ItemView.cs \ src/Gui/Widgets/Led.cs \ src/Gui/Widgets/SearchResultView.cs \ src/Gui/Widgets/VolumeView.cs \ src/Icons/CustomIconTheme.cs \ src/Icons/Icon.cs \ src/Icons/IconCache.cs \ src/Icons/IconUtils.cs \ src/Icons/ItemIcons.cs \ src/Icons/MimeIconCache.cs \ src/Icons/NameInCustomIconThemeAttribute.cs \ src/App.cs \ src/AssemblyInfo.cs \ src/PathUtil.cs \ src/FileDialog.cs \ src/Main.cs \ src/MsgDialog.cs \ src/Settings.cs \ src/Util.cs \ src/S.cs \ src/Gui/Widgets/CategoryView.cs \ src/Gui/Widgets/PageNavigation.cs \ src/Gui/Widgets/PageNavigationEvents.cs \ src/Gui/Widgets/IconEntry.cs \ src/Gui/Widgets/SearchEntry.cs \ src/Gui/Widgets/ItemPreview.cs \ src/Gui/Import.cs \ src/Icons/CustomIconThemeMimeMapping.cs \ src/MimeCategoryMapping.cs \ src/Gui/ItemProperties.cs \ src/Gui/ObjectProperties.cs \ src/Gui/Widgets/Editors/AudioCdVolumeEditor.cs \ src/Gui/Widgets/Editors/AudioTrackItemEditor.cs \ src/Gui/Widgets/Editors/FileSystemItemEditor.cs \ src/Gui/Widgets/Editors/FileSystemVolumeEditor.cs \ src/Gui/Widgets/Editors/ItemEditor.cs \ src/Gui/Widgets/Editors/ObjectEditor.cs \ src/Gui/Widgets/Editors/ObjectEditorEvents.cs \ src/Gui/Widgets/Editors/ObjectEditorExceptions.cs \ src/Gui/Widgets/Editors/VolumeEditor.cs \ src/Gui/Widgets/Editors/FileItemEditor.cs \ src/Gui/Widgets/Editors/DirectoryItemEditor.cs \ src/Gui/Widgets/Sorting.cs \ src/Options.cs \ src/Global.cs \ src/Gui/Widgets/InfoBar.cs \ src/Gui/WaitingDialog.cs DATA_FILES = RESOURCES = \ images/LED_Off.png,Basenji.images.LED_Off.png \ images/LED_On.png,Basenji.images.LED_On.png \ po/de.resources,Basenji.po.de.resources \ po/he.resources,Basenji.po.he.resources \ po/da.resources,Basenji.po.da.resources \ po/es.resources,Basenji.po.es.resources \ po/fr.resources,Basenji.po.fr.resources \ po/ru.resources,Basenji.po.ru.resources \ po/bg.resources,Basenji.po.bg.resources \ po/it.resources,Basenji.po.it.resources \ po/oc.resources,Basenji.po.oc.resources \ po/pt_BR.resources,Basenji.po.pt_BR.resources \ po/tr.resources,Basenji.po.tr.resources \ images/calendar.png,Basenji.images.calendar.png \ po/pl.resources,Basenji.po.pl.resources \ po/hu.resources,Basenji.po.hu.resources \ po/et.resources,Basenji.po.et.resources \ po/uk.resources,Basenji.po.uk.resources \ po/zh_CN.resources,Basenji.po.zh_CN.resources \ po/sr.resources,Basenji.po.sr.resources \ po/hr.resources,Basenji.po.hr.resources \ po/nl.resources,Basenji.po.nl.resources \ po/cs.resources,Basenji.po.cs.resources \ po/sk.resources,Basenji.po.sk.resources EXTRAS = \ app.desktop \ basenji \ Basenji.exe.config \ src/App.cs.in \ basenji.desktop.in \ basenji.in REFERENCES = \ -pkg:gtk-sharp-2.0 \ -pkg:glib-sharp-2.0 \ System \ Mono.Cairo \ System.Core DLL_REFERENCES = CLEANFILES = $(PROGRAMFILES) $(LINUX_DESKTOPAPPLICATIONS) $(BINARIES) #Targets all: $(ASSEMBLY) $(PROGRAMFILES) $(LINUX_DESKTOPAPPLICATIONS) $(BINARIES) $(top_srcdir)/config.make include $(top_srcdir)/Makefile.include include $(srcdir)/custom-hooks.make $(eval $(call emit-deploy-wrapper,BASENJI_DESKTOP,basenji.desktop)) $(eval $(call emit-deploy-wrapper,BASENJI,basenji)) $(eval $(call emit-deploy-target,BASENJI_EXE_CONFIG)) $(eval $(call emit-deploy-target,PLATFORM_DLL)) $(eval $(call emit-deploy-target,PLATFORM_DLL_CONFIG)) $(eval $(call emit-deploy-target,PLATFORM_DLL_MDB)) $(eval $(call emit-deploy-target,VOLUMEDB_DLL)) $(eval $(call emit-deploy-target,PLATFORM_COMMON_DB_DLL)) $(eval $(call emit-deploy-target,PLATFORM_COMMON_DB_DLL_MDB)) $(eval $(call emit-deploy-target,MUSICBRAINZ_DLL)) $(eval $(call emit-deploy-target,MUSICBRAINZ_DLL_MDB)) $(eval $(call emit-deploy-target,VOLUMEDB_DLL_MDB)) $(eval $(call emit_resgen_targets)) $(build_xamlg_list): %.xaml.g.cs: %.xaml xamlg '$<' # Targets for Custom commands DEBUG_AfterBuild: (cd $(srcdir) && ./custom_build_commands.sh --after-build $(BUILD_DIR)) DEBUG_AfterClean: (cd $(srcdir) && ./custom_build_commands.sh --after-clean $(BUILD_DIR)) RELEASE_AfterBuild: (cd $(srcdir) && ./custom_build_commands.sh --after-build $(BUILD_DIR)) RELEASE_AfterClean: (cd $(srcdir) && ./custom_build_commands.sh --after-clean $(BUILD_DIR)) GNOME_DEBUG_AfterBuild: (cd $(srcdir) && ./custom_build_commands.sh --after-build $(BUILD_DIR)) GNOME_DEBUG_AfterClean: (cd $(srcdir) && ./custom_build_commands.sh --after-clean $(BUILD_DIR)) GNOME_RELEASE_AfterBuild: (cd $(srcdir) && ./custom_build_commands.sh --after-build $(BUILD_DIR)) GNOME_RELEASE_AfterClean: (cd $(srcdir) && ./custom_build_commands.sh --after-clean $(BUILD_DIR)) $(ASSEMBLY_MDB): $(ASSEMBLY) $(ASSEMBLY): $(build_sources) $(build_resources) $(build_datafiles) $(DLL_REFERENCES) $(PROJECT_REFERENCES) $(build_xamlg_list) $(build_satellite_assembly_list) make pre-all-local-hook prefix=$(prefix) mkdir -p $(shell dirname $(ASSEMBLY)) make $(CONFIG)_BeforeBuild $(ASSEMBLY_COMPILER_COMMAND) $(ASSEMBLY_COMPILER_FLAGS) -out:$(ASSEMBLY) -target:$(COMPILE_TARGET) $(build_sources_embed) $(build_resources_embed) $(build_references_ref) make $(CONFIG)_AfterBuild make post-all-local-hook prefix=$(prefix) install-local: $(ASSEMBLY) $(ASSEMBLY_MDB) make pre-install-local-hook prefix=$(prefix) make install-satellite-assemblies prefix=$(prefix) mkdir -p '$(DESTDIR)$(libdir)/$(PACKAGE)' $(call cp,$(ASSEMBLY),$(DESTDIR)$(libdir)/$(PACKAGE)) $(call cp,$(ASSEMBLY_MDB),$(DESTDIR)$(libdir)/$(PACKAGE)) $(call cp,$(BASENJI_EXE_MDB),$(DESTDIR)$(libdir)/$(PACKAGE)) mkdir -p '$(DESTDIR)$(datadir)/applications' $(call cp,$(BASENJI_DESKTOP),$(DESTDIR)$(datadir)/applications) mkdir -p '$(DESTDIR)$(bindir)' $(call cp,$(BASENJI),$(DESTDIR)$(bindir)) $(call cp,$(BASENJI_EXE_CONFIG),$(DESTDIR)$(libdir)/$(PACKAGE)) $(call cp,$(PLATFORM_DLL),$(DESTDIR)$(libdir)/$(PACKAGE)) $(call cp,$(PLATFORM_DLL_CONFIG),$(DESTDIR)$(libdir)/$(PACKAGE)) $(call cp,$(PLATFORM_DLL_MDB),$(DESTDIR)$(libdir)/$(PACKAGE)) $(call cp,$(VOLUMEDB_DLL),$(DESTDIR)$(libdir)/$(PACKAGE)) $(call cp,$(PLATFORM_COMMON_DB_DLL),$(DESTDIR)$(libdir)/$(PACKAGE)) $(call cp,$(PLATFORM_COMMON_DB_DLL_MDB),$(DESTDIR)$(libdir)/$(PACKAGE)) $(call cp,$(MUSICBRAINZ_DLL),$(DESTDIR)$(libdir)/$(PACKAGE)) $(call cp,$(MUSICBRAINZ_DLL_MDB),$(DESTDIR)$(libdir)/$(PACKAGE)) $(call cp,$(VOLUMEDB_DLL_MDB),$(DESTDIR)$(libdir)/$(PACKAGE)) make post-install-local-hook prefix=$(prefix) uninstall-local: $(ASSEMBLY) $(ASSEMBLY_MDB) make pre-uninstall-local-hook prefix=$(prefix) make uninstall-satellite-assemblies prefix=$(prefix) $(call rm,$(ASSEMBLY),$(DESTDIR)$(libdir)/$(PACKAGE)) $(call rm,$(ASSEMBLY_MDB),$(DESTDIR)$(libdir)/$(PACKAGE)) $(call rm,$(BASENJI_EXE_MDB),$(DESTDIR)$(libdir)/$(PACKAGE)) $(call rm,$(BASENJI_DESKTOP),$(DESTDIR)$(datadir)/applications) $(call rm,$(BASENJI),$(DESTDIR)$(bindir)) $(call rm,$(BASENJI_EXE_CONFIG),$(DESTDIR)$(libdir)/$(PACKAGE)) $(call rm,$(PLATFORM_DLL),$(DESTDIR)$(libdir)/$(PACKAGE)) $(call rm,$(PLATFORM_DLL_CONFIG),$(DESTDIR)$(libdir)/$(PACKAGE)) $(call rm,$(PLATFORM_DLL_MDB),$(DESTDIR)$(libdir)/$(PACKAGE)) $(call rm,$(VOLUMEDB_DLL),$(DESTDIR)$(libdir)/$(PACKAGE)) $(call rm,$(PLATFORM_COMMON_DB_DLL),$(DESTDIR)$(libdir)/$(PACKAGE)) $(call rm,$(PLATFORM_COMMON_DB_DLL_MDB),$(DESTDIR)$(libdir)/$(PACKAGE)) $(call rm,$(MUSICBRAINZ_DLL),$(DESTDIR)$(libdir)/$(PACKAGE)) $(call rm,$(MUSICBRAINZ_DLL_MDB),$(DESTDIR)$(libdir)/$(PACKAGE)) $(call rm,$(VOLUMEDB_DLL_MDB),$(DESTDIR)$(libdir)/$(PACKAGE)) make post-uninstall-local-hook prefix=$(prefix) install: install-local uninstall: uninstall-local clean: clean-local include $(top_srcdir)/rules.make Basenji/Basenji.mdp0000664000175000017500000002746312067326706014411 0ustar patrickpatrick Basenji/po/0000775000175000017500000000000012067326706012736 5ustar patrickpatrickBasenji/po/hr.resources0000664000175000017500000003250112067326706015304 0ustar patrickpatricklSystem.Resources.ResourceReader, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089#System.Resources.RuntimeResourceSetPADPADP̯[\ĒZFn_`/+ܽێyB_2 bJ䗖x~?ޘ ǚ˚}朮G  +Iљ,ޠ}ѬX`pѨE7kݏѝ!峸/# *?8 ڻMo;,锼xb5x,Qoĵgsv59}΍\$о DaрO51 թ}&ٍɬڴn^/gk䷧p$dF>?y7 Taq;͈nYDoY`rYrY$sYsYStYj~Ԕx06Z P4 * J  o> 8a c iz $ |q c O\mga}AKuQ>R j!ز$&P%%*U++1;v9`9vE:Iu:>Y@;CBsDH1L2Q;RfMSMeS@STXmޡY![[vk Tt ]DZ t  e E4}0P  `hVl"  w   ]N1s XZ|.  & ? QKix p '#+$"{0}" is {1}. Expected format: {2} Please correct or remove the data you entered.(empty)Z<b>Page {0}/{1}</b> ({2} - {3} of {4} items)&<b>Scanner Log:</b>64<b>Volume Information:</b>O Abortm Added:uVAll database changes have been rolled back.~All filesAll items^An error occured while accessing drive {0}: {1}fAn error occured while loading the volume list: {0}JAn unhandled exception occured ({0}).Applications<Archive No.HArchive No.:TArchivesavAre you sure you really want to remove the selected volume?i ArtistAudio CDAudio CD trackAudiobooks Author Backup BytesCategoryCategory:FCompute hashcodes for files (slow!)!ConfirmationSCopyright\Copyright (c) lCreated:|Creator2Database '{0}' not found.&Database PropertiesDatabase accessFDatabase already exists. Overwrite?Database exists$Database not found&Database not found.9Database:UDate addedeFDefault database not found. Create?vDescendingDescriptionDescription:DevelopmentDimensionsDirectoriesDirectories:Directory,Discard symbolic linksDocuments4Don't prompt, always scan: Drive zDrive {0} is neither mounted nor does it contain an audio cd.'.Drive {0} is not ready.YDrivetypeqDurationDuration:Edit Item Error Extract metadataXFetch audio cd metadata from MusicBrainz.orgFileFile count Files:FilesystemFiletype/Filter volumes? FormatSFormat:[DFound {0} items in {1:F3} seconds.cGB GamesGeneral&Generate Thumbnails GenreHashHashed:Icon theme: Images ImportImport DatabaseImport aborted. Search itemsP Searching...b "Show hidden filesu &Show iteminfo panel DShow thumbnails in the filebrowser Size Software Sort by VStopping Scanner and performing rollback... Symlink target$ TB; Text? The selected icon theme is currently not supported on your system.F NThis database version is not supported. Time lTimeout: another search is probably still in progress. Title Title: xToo many search results. Please refine your search criteria. Total size:0Track No.CTracks:OTypeXUnknown_Unnamedj8Unsupported database versionw"Unsupported theme(Using VolumeDB v{0}. Videos Volume"Volume PropertiesVolume type:(VolumeDatabase filesVolumeScanner*Waiting for drives...-YearAYesItYou must restart {0} for icontheme changes to take effect.MdYou must stop scanning before closing this window.hYou must stop the import before closing this window.(_Database Properties_Edit Volume_Import!_Load Defaults)_New DatabaseK_Open Database`_Preferencesy _Quit_Remove Volumebydefault filesfromno tracksyes"{0:0}% completed.{0} Bytes.{0} is already running.&{0} volumes loaded.Project-Id-Version: basenji Report-Msgid-Bugs-To: FULL NAME POT-Creation-Date: 2012-07-15 15:49+0200 PO-Revision-Date: 2012-09-29 08:42+0000 Last-Translator: freedomrun Language-Team: Croatian MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Launchpad-Export-Date: 2012-10-27 11:00+0000 X-Generator: Launchpad (build 16194) S"{0}" je {1}. Treženi format: {2} Molim ispravite ili izbrišite unesene podatke.(prazno)/Strana {0}/{1} ({2} - {3} od {4} stavke)Dnevnik skenera:Informacije o pogonu:PrekidDodano:'Promjene u bazi podataka su stornirane. Sve datoteke Sve stavke&Grška kod pristupanja pogonu {0}: {1}*Greška kod učitavanja popisa pogona: {0}%Dogodila se neobradiva iznimka ({0}). Aplikacije Arhiva No. Br. Arhive:ArhiveBJeste li sigurni da želite zapravo izbrisati odabranu zapremninu? Umjetnik/caAudio CDAudioCD pjesmaGlazbene knjigeAutorSigurnosna kopijaBajtovi Kategorija Kategorija:0Izračunaj hash vrijednosti za datoteke (sporo!)PotvrdaAutorsko pravoCopyright (c)  Izrađeno: Stvaralac!Baza podataka '{0}' nije nađena.Svojstva databazePristup bazi podataka!Baza podataka postoji. Prepisati?Baza podataka postojiBaza podataka nije pronađenaBaza podataka nije nađenaBaza podataka:Datum dodavanja,Zadana baza podataka nije nađena. Izraditi?SilaznoOpisOpis:Razvoj DimnezijeMapeMape:MapaOdbaci dimboličke veze DokumentiNe pitaj, uvijek skeniraj:Pogon0Pogon {0} nije montiran ili ne sadrži audio cd.Pogon{0} nije spreman. Vrsta pogonaTrajanje Trajanje:Izmijeniti stavkuGreškaIzvadi meta podatke1Dobavi meta podatke za audio cd s MusicBrainz.orgDatoteka Broj datoteka Datoteke:Datotečni sustavVrsta datotekeFiltriranje pogonaFormatOblik:$Nađeno {0} stavki u {1:F3} sekunde.GBIgre OpćenitoGeneriti ikoneŽanrHash Hashirano: Tema ikona:SlikeUveziUvezi bazu podatakaUvoz obstavljen.Uvoz završen uspješno.Uvoz nije uspioUvoz neuspješan Uvoz u tijekuNevažeći podaciSvojstva stavke Vrsta stavkeKBKljučne riječiKljučne riječi:OznakaJezikVrijeme zadnjeg pisanjaUčitavanje…Datum posudbe: Posuđeno:LokacijaMBPorukaRaznoFilmoviGlazbaNazivNaziv:Ne Nema stavki.Nema rezultata.NištaNapomena_Otvori zadanu bazu podataka ImaOpcije#Opcije: MusicBrainz omogućena: {0}kOpcije: generirati sličice: {0} , izvaditi metapodatke: {1}, odbaciti simboličke veze: {2}, hashing: {3}.Ostalo Broj stranica FotografijeUpišite ime nove baze podatakaOdaberite bazu podataka.Odaberite bazu podataka za uvoz$Molim odaberite pogon za pretražiti Osobitosti ProducentNedavne baze podataka.Otvori prijašnju bazu podataka na pokretanju.Potrebno ponovno pokretanjeDatum vraćanja:Skeniranje u tijekuSkenerSkeniranje prekinuto.Skeniranje uspješno završeno.FSkeniranje nije uspjelo. Razlog: dogodila se neobradiva iznimka ({0}).#Počelo je skeniranje pogona '{0}'.Skeniranje je počelo.Pretraži stavkePretraži stavkePretraživanje...Prikaži skrivene datoteke#Prikaži panel za info. o stavkama.(Prikaži sličice u pregledniku datoteka VeličinaSoftware Razvrstaj poZaustavljam skener i storniram.Cilj simboličke vezeTBTekst>Odabrana tema ikona trenutno nije podržana na vašem sistemu.%Verzija baze podataka nije podržana.Vrijeme4Vrijeme isteklo: drugo pretraživanje još u tijeku.NaslovNaslov:1Previše rezultata. Prepravite kriterij pretrage.Ukupna veličina: Br. PjesmePjesme:Vrsta Nepoznato Neimenovano$Verzija baze podataka nije podržanaNrpodržana temaKorištenje VolumeDB v{0}. Video snimke GlasnoćaSvojstva pogonaVrsta uređaja:VolumeDatabase datoteke SkenerPogonaČekanje pogona...GodinaDaAIzmjene teme ikona bit će vidljive nakon ponovnog pokretanja {0}6Morate zaustaviti skeniranje prije zatvaranja prozora.0Morate zaustaviti uvoz prije zatvaranja prozora._Svojstva baze podataka _Uredi pogon_Uvozi _Učitaj uobičajene vrijednosti_Nova baza podataka_Otvoriti bazu podataka _Osobitosti_Izlaz_Izbriši pogonodzadanodatotekeodnepjesmeda{0:0}% Završreno {0} Bajtova{0} je već pokrenut.{0} pogona učitano.Basenji/po/fr.po0000664000175000017500000005314312067326706013713 0ustar patrickpatrick# French translation for basenji # Copyright (c) 2009 Rosetta Contributors and Canonical Ltd 2009 # This file is distributed under the same license as the basenji package. # FIRST AUTHOR , 2009. # msgid "" msgstr "" "Project-Id-Version: basenji\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2012-07-15 15:49+0200\n" "PO-Revision-Date: 2012-07-03 10:21+0000\n" "Last-Translator: Tubuntu \n" "Language-Team: French \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2012-10-27 11:00+0000\n" "X-Generator: Launchpad (build 16194)\n" #: src/Util.cs:30 #, csharp-format msgid "{0} Bytes" msgstr "{0} Octets" #: src/Util.cs:32 msgid "Bytes" msgstr "Octets" #: src/Util.cs:32 msgid "KB" msgstr "Ko" #: src/Util.cs:32 msgid "MB" msgstr "Mo" #: src/Util.cs:32 msgid "GB" msgstr "Go" #: src/Util.cs:32 msgid "TB" msgstr "To" #: src/Options.cs:477 msgid "OptionName" msgstr "Nom de l'option" #: src/FileDialog.cs:51 msgid "VolumeDatabase files" msgstr "Fichiers VolumeDatabase" #: src/FileDialog.cs:56 msgid "All files" msgstr "Tous les fichiers" #: src/Main.cs:142 src/Gui/MainWindow.cs:76 src/Gui/MainWindow.cs:92 #: src/Gui/MainWindow.cs:334 src/Gui/MainWindow.cs:355 #: src/Gui/MainWindow.cs:377 src/Gui/MainWindow.cs:386 #: src/Gui/MainWindow.cs:635 msgid "Error" msgstr "Erreur" #: src/Main.cs:142 #, csharp-format msgid "{0} is already running." msgstr "{0} est en cours de traitement." #: src/Gui/Widgets/VolumeView.cs:42 src/Gui/Widgets/SearchResultView.cs:30 msgid "Unnamed" msgstr "Sans nom" #: src/Gui/Widgets/VolumeView.cs:43 #: src/Gui/Widgets/Editors/VolumeEditor.cs:259 msgid "Category:" msgstr "Catégorie :" #: src/Gui/Widgets/VolumeView.cs:44 msgid "files" msgstr "fichiers" #: src/Gui/Widgets/VolumeView.cs:45 msgid "tracks" msgstr "pistes" #: src/Gui/Widgets/ItemView.cs:29 msgid "Loading..." msgstr "Chargement…" #: src/Gui/Widgets/ItemView.cs:30 msgid "(empty)" msgstr "(vide)" #: src/Gui/Widgets/ItemView.cs:99 src/Gui/DriveSelection.cs:80 msgid "Unknown" msgstr "Inconnu" #: src/Gui/Widgets/ItemView.cs:170 src/Gui/Widgets/Editors/ItemEditor.cs:96 msgid "Name" msgstr "Nom" #: src/Gui/Widgets/ItemView.cs:176 msgid "Artist" msgstr "Artiste" #: src/Gui/Widgets/ItemView.cs:181 #: src/Gui/Widgets/Editors/AudioTrackItemEditor.cs:53 #: src/Gui/Widgets/ItemInfo.cs:225 src/Gui/Widgets/ItemInfo.cs:288 msgid "Duration" msgstr "Durée" #: src/Gui/Widgets/Editors/FileSystemVolumeEditor.cs:34 #: src/Gui/DriveSelection.cs:168 msgid "Filesystem" msgstr "Système de fichiers" #: src/Gui/Widgets/Editors/FileSystemVolumeEditor.cs:65 msgid "Files:" msgstr "Fichiers :" #: src/Gui/Widgets/Editors/FileSystemVolumeEditor.cs:66 msgid "Directories:" msgstr "Dossiers :" #: src/Gui/Widgets/Editors/FileSystemVolumeEditor.cs:67 msgid "Total size:" msgstr "Taille totale :" #: src/Gui/Widgets/Editors/ItemEditor.cs:95 msgid "Item type" msgstr "Type d'élément" #: src/Gui/Widgets/Editors/ItemEditor.cs:111 src/Gui/Widgets/ItemInfo.cs:371 msgid "Note" msgstr "Note" #: src/Gui/Widgets/Editors/ItemEditor.cs:112 src/Gui/Widgets/ItemInfo.cs:374 msgid "Keywords" msgstr "Mots-clés" #: src/Gui/Widgets/Editors/AudioTrackItemEditor.cs:31 #: src/Gui/Widgets/SearchResultView.cs:34 msgid "Audio CD track" msgstr "Piste CD Audio" #: src/Gui/Widgets/Editors/AudioTrackItemEditor.cs:54 #: src/Gui/Widgets/ItemInfo.cs:230 msgid "Type" msgstr "Type" #: src/Gui/Widgets/Editors/DirectoryItemEditor.cs:28 msgid "Directory" msgstr "Dossier" #: src/Gui/Widgets/Editors/FileSystemItemEditor.cs:59 #: src/Gui/Widgets/SearchResultView.cs:31 src/Gui/Widgets/ItemInfo.cs:183 msgid "Location" msgstr "Emplacement" #: src/Gui/Widgets/Editors/FileSystemItemEditor.cs:60 #: src/Gui/Widgets/ItemInfo.cs:185 msgid "Last write time" msgstr "Dernier enregistrement" #: src/Gui/Widgets/Editors/FileSystemItemEditor.cs:61 #: src/Gui/Widgets/ItemInfo.cs:210 msgid "Filetype" msgstr "Type" #: src/Gui/Widgets/Editors/FileItemEditor.cs:31 msgid "File" msgstr "Fichier" #: src/Gui/Widgets/Editors/FileItemEditor.cs:52 #: src/Gui/Widgets/ItemInfo.cs:204 src/Gui/Widgets/ItemInfo.cs:226 #: src/Gui/DriveSelection.cs:148 msgid "Size" msgstr "Taille" #: src/Gui/Widgets/Editors/FileItemEditor.cs:53 #: src/Gui/Widgets/ItemInfo.cs:206 msgid "Hash" msgstr "Hachage" #: src/Gui/Widgets/Editors/AudioCdVolumeEditor.cs:33 msgid "Audio CD" msgstr "CD Audio" #: src/Gui/Widgets/Editors/AudioCdVolumeEditor.cs:63 msgid "Tracks:" msgstr "Pistes :" #: src/Gui/Widgets/Editors/AudioCdVolumeEditor.cs:64 msgid "Duration:" msgstr "Durée :" #: src/Gui/Widgets/Editors/VolumeEditor.cs:45 msgid "Backup" msgstr "Sauvegarde" #: src/Gui/Widgets/Editors/VolumeEditor.cs:46 #: src/Gui/Widgets/CategoryView.cs:60 msgid "Documents" msgstr "Documents" #: src/Gui/Widgets/Editors/VolumeEditor.cs:47 #: src/Gui/Widgets/CategoryView.cs:61 msgid "Music" msgstr "Musique" #: src/Gui/Widgets/Editors/VolumeEditor.cs:48 msgid "Audiobooks" msgstr "Livres Audio" #: src/Gui/Widgets/Editors/VolumeEditor.cs:49 #: src/Gui/Widgets/CategoryView.cs:62 msgid "Movies" msgstr "Films" #: src/Gui/Widgets/Editors/VolumeEditor.cs:50 msgid "Videos" msgstr "Vidéos" #: src/Gui/Widgets/Editors/VolumeEditor.cs:51 msgid "Pictures" msgstr "Images" #: src/Gui/Widgets/Editors/VolumeEditor.cs:52 msgid "Games" msgstr "Jeux" #: src/Gui/Widgets/Editors/VolumeEditor.cs:53 src/Gui/Widgets/ItemInfo.cs:319 msgid "Software" msgstr "Logiciel" #: src/Gui/Widgets/Editors/VolumeEditor.cs:54 msgid "Misc" msgstr "Divers" #: src/Gui/Widgets/Editors/VolumeEditor.cs:55 msgid "Other" msgstr "Autre" #: src/Gui/Widgets/Editors/VolumeEditor.cs:225 msgid "Yes" msgstr "Oui" #: src/Gui/Widgets/Editors/VolumeEditor.cs:225 msgid "No" msgstr "Non" #: src/Gui/Widgets/Editors/VolumeEditor.cs:235 msgid "Volume type:" msgstr "Type de média :" #: src/Gui/Widgets/Editors/VolumeEditor.cs:236 msgid "Hashed:" msgstr "Empreinte :" #: src/Gui/Widgets/Editors/VolumeEditor.cs:237 msgid "Added:" msgstr "Ajouté:" #: src/Gui/Widgets/Editors/VolumeEditor.cs:258 msgid "Archive No.:" msgstr "No. d'archive :" #: src/Gui/Widgets/Editors/VolumeEditor.cs:260 msgid "Title:" msgstr "Titre :" #: src/Gui/Widgets/Editors/VolumeEditor.cs:261 src/Gui/DBProperties.cs:98 msgid "Description:" msgstr "Description :" #: src/Gui/Widgets/Editors/VolumeEditor.cs:262 msgid "Keywords:" msgstr "Mots-clés :" #: src/Gui/Widgets/Editors/VolumeEditor.cs:263 msgid "Loaned to:" msgstr "Prêtés à :" #: src/Gui/Widgets/Editors/VolumeEditor.cs:264 msgid "Loaned date:" msgstr "Date de prêt :" #: src/Gui/Widgets/Editors/VolumeEditor.cs:265 msgid "Return date:" msgstr "Date de retour :" #: src/Gui/Widgets/CategoryView.cs:58 msgid "Directories" msgstr "Dossiers" #: src/Gui/Widgets/CategoryView.cs:59 msgid "Text" msgstr "Texte" #: src/Gui/Widgets/CategoryView.cs:63 msgid "Images" msgstr "Images" #: src/Gui/Widgets/CategoryView.cs:64 msgid "Applications" msgstr "Programmes" #: src/Gui/Widgets/CategoryView.cs:65 msgid "Archives" msgstr "Archives" #: src/Gui/Widgets/CategoryView.cs:66 msgid "Development" msgstr "Développement" #: src/Gui/Widgets/CategoryView.cs:96 src/Gui/MainWindow.cs:1046 msgid "Category" msgstr "Catégorie" #: src/Gui/Widgets/CategoryView.cs:128 msgid "All items" msgstr "Tous les objets" #: src/Gui/Widgets/SearchResultView.cs:32 msgid "Volume" msgstr "Volume" #: src/Gui/Widgets/SearchResultView.cs:33 src/Gui/MainWindow.cs:1040 msgid "Archive No." msgstr "No. Archive" #: src/Gui/Widgets/ItemInfo.cs:40 msgid "by" msgstr "par" #: src/Gui/Widgets/ItemInfo.cs:41 msgid "from" msgstr "de" #: src/Gui/Widgets/ItemInfo.cs:196 msgid "Symlink target" msgstr "destination du lien" #: src/Gui/Widgets/ItemInfo.cs:227 msgid "Track No." msgstr "No. Piste" #: src/Gui/Widgets/ItemInfo.cs:258 msgid "Genre" msgstr "Genre" #: src/Gui/Widgets/ItemInfo.cs:278 msgid "Year" msgstr "Année" #: src/Gui/Widgets/ItemInfo.cs:283 msgid "Description" msgstr "Description" #: src/Gui/Widgets/ItemInfo.cs:294 msgid "Dimensions" msgstr "Dimensions" #: src/Gui/Widgets/ItemInfo.cs:299 msgid "Format" msgstr "Format" #: src/Gui/Widgets/ItemInfo.cs:303 msgid "Author" msgstr "Auteur" #: src/Gui/Widgets/ItemInfo.cs:307 msgid "Copyright" msgstr "Copyright" #: src/Gui/Widgets/ItemInfo.cs:311 msgid "Producer" msgstr "Producteur" #: src/Gui/Widgets/ItemInfo.cs:315 msgid "Creator" msgstr "Créateur" #: src/Gui/Widgets/ItemInfo.cs:323 msgid "Language" msgstr "Langage" #: src/Gui/Widgets/ItemInfo.cs:327 msgid "Page count" msgstr "Nombre de pages" #: src/Gui/Widgets/ItemInfo.cs:346 msgid "File count" msgstr "Nombre de fichiers" #: src/Gui/Widgets/PageNavigation.cs:27 msgid "No items." msgstr "Aucun objet." #: src/Gui/Widgets/PageNavigation.cs:145 #, csharp-format msgid "Page {0}/{1} ({2} - {3} of {4} items)" msgstr "Page {0}/{1} ({2} - {3} sur {4} objets)" #: src/Gui/ObjectProperties.cs:54 src/Gui/VolumeScanner.cs:248 msgid "Invalid data" msgstr "Donnée invalide" #: src/Gui/ObjectProperties.cs:54 src/Gui/VolumeScanner.cs:249 #, csharp-format msgid "" "\"{0}\" is {1}.\n" "\n" "Expected format: {2}\n" "Please correct or remove the data you entered." msgstr "" "\"{0}\" est {1}.\n" "\n" "Format attendu : {2}\n" "Vous devez corriger ou supprimer les données entrées." #: src/Gui/DBProperties.cs:85 msgid "Database Properties" msgstr "Propriétés de la base de données" #: src/Gui/DBProperties.cs:97 msgid "Name:" msgstr "Nom :" #: src/Gui/DBProperties.cs:99 msgid "Created:" msgstr "Créé :" #: src/Gui/VolumeProperties.cs:29 msgid "Volume Properties" msgstr "Propriétés du Média" #: src/Gui/DriveSelection.cs:60 msgid "Waiting for drives..." msgstr "Attente des lecteurs..." #: src/Gui/DriveSelection.cs:133 msgid "Drive" msgstr "Lecteur" #: src/Gui/DriveSelection.cs:139 msgid "Label" msgstr "Étiquette" #: src/Gui/DriveSelection.cs:241 msgid "Please select a drive to scan" msgstr "Sélectionnez le lecteur à analyser" #: src/Gui/About.cs:28 msgid "A cross-platform media indexing/search tool." msgstr "Un outil multi-plateforme d'indexation et de recherche de médias." #: src/Gui/About.cs:29 #, csharp-format msgid "Using VolumeDB v{0}." msgstr "Vous utilisez VolumeDB v{0}." #: src/Gui/About.cs:31 msgid "Copyright (c) " msgstr "Copyright (c) " #: src/Gui/ItemSearch.cs:81 #, csharp-format msgid "Found {0} items in {1:F3} seconds." msgstr "Trouvé {0} objets en {1:F3} secondes." #: src/Gui/ItemSearch.cs:92 src/Gui/MainWindow.cs:519 msgid "Timeout: another search is probably still in progress." msgstr "" "Dépassement de temps : une autre recherche est probablement déjà en cours." #: src/Gui/ItemSearch.cs:94 msgid "Too many search results. Please refine your search criteria." msgstr "" "Trop de résultats pour votre recherche. Affinez vos critères de recherche." #: src/Gui/ItemSearch.cs:112 src/Gui/MainWindow.cs:535 msgid "Searching..." msgstr "Recherche en cours..." #: src/Gui/ItemSearch.cs:267 msgid "Search Items" msgstr "Objets recherchés" #: src/Gui/ItemSearch.cs:279 src/Gui/MainWindow.cs:1145 msgid "default" msgstr "défaut" #: src/Gui/ItemSearch.cs:283 msgid "Search items" msgstr "elements de recherche" #: src/Gui/ItemSearch.cs:318 msgid "Quick tip:" msgstr "Astuce rapide" #: src/Gui/ItemSearch.cs:319 #, csharp-format msgid "" "Click on the icon to the left of the search field to build advanced search " "queries.\n" "Example: {0}" msgstr "" #: src/Gui/ItemSearch.cs:326 msgid "No search results." msgstr "Aucun résultat de recherche." #: src/Gui/ItemSearch.cs:375 src/Gui/MainWindow.cs:1028 msgid "Edit Item" msgstr "Éditer un élément" #: src/Gui/ItemSearch.cs:382 msgid "Show in Main Window" msgstr "Afficher dans la fenêtre principale" #: src/Gui/MainWindow.cs:77 src/Gui/MainWindow.cs:93 src/Gui/MainWindow.cs:635 #, csharp-format msgid "Database '{0}' not found." msgstr "Base de données '{0}' introuvable." #: src/Gui/MainWindow.cs:185 msgid "Database not found" msgstr "Base de données non trouvée" #: src/Gui/MainWindow.cs:186 msgid "Default database not found. Create?" msgstr "Base de donnée par défaut non trouvée. Créer une nouvelle ?" #: src/Gui/MainWindow.cs:215 msgid "Unsupported database version" msgstr "Version de base de données non supportée" #: src/Gui/MainWindow.cs:216 msgid "This database version is not supported." msgstr "Cette version de base de données n'est pas supportée." #: src/Gui/MainWindow.cs:235 #, csharp-format msgid "{0} volumes loaded." msgstr "{0} médias chargés." #: src/Gui/MainWindow.cs:256 #, csharp-format msgid "An error occured while loading the volume list: {0}" msgstr "" "Une erreur est survenue lors du chargement des données du média : {0}" #: src/Gui/MainWindow.cs:300 msgid "Please enter the name for the new database" msgstr "Veuillez entrer le nom de la nouvelle base de données" #: src/Gui/MainWindow.cs:312 msgid "Database exists" msgstr "La base de donnée existe déjà" #: src/Gui/MainWindow.cs:313 msgid "Database already exists. Overwrite?" msgstr "Cette base de données existe déjà. La remplacer ?" #: src/Gui/MainWindow.cs:326 msgid "Please select a database" msgstr "Veuillez sélectionner une base de données" #: src/Gui/MainWindow.cs:335 src/Gui/Import.cs:83 msgid "Database not found." msgstr "Base de données introuvable." #: src/Gui/MainWindow.cs:356 #, csharp-format msgid "" "An error occured while accessing drive {0}:\n" "{1}" msgstr "" "Une erreur est survenue lors de l'accès au lecteur {0} :\n" "{1}" #: src/Gui/MainWindow.cs:378 #, csharp-format msgid "Drive {0} is not ready." msgstr "Le lecteur {0} n'est pas prêt." #: src/Gui/MainWindow.cs:387 #, csharp-format msgid "Drive {0} is neither mounted nor does it contain an audio cd." msgstr "Lecteur {0} n'est pas monté ou ne contient pas un CD Audio." #: src/Gui/MainWindow.cs:406 msgid "Confirmation" msgstr "Confirmation" #: src/Gui/MainWindow.cs:407 msgid "Are you sure you really want to remove the selected volume?" msgstr "Voulez-vous vraiment supprimé le média sélectionné ?" #: src/Gui/MainWindow.cs:712 #, csharp-format msgid "Please insert volume '{0}'." msgstr "" #: src/Gui/MainWindow.cs:714 msgid "Waiting for volume" msgstr "" #: src/Gui/MainWindow.cs:966 msgid "Add Volume" msgstr "Ajout d'un volume" #: src/Gui/MainWindow.cs:970 msgid "Search" msgstr "Rechercher" #: src/Gui/MainWindow.cs:973 msgid "App Menu" msgstr "Menu Applications" #: src/Gui/MainWindow.cs:979 msgid "_New Database" msgstr "_Nouvelle BDD" #: src/Gui/MainWindow.cs:982 msgid "_Open Database" msgstr "_Ouvrir BDD" #: src/Gui/MainWindow.cs:985 msgid "Open Default Database" msgstr "Ouvrir la BDD par défaut" #: src/Gui/MainWindow.cs:991 msgid "Recent Databases" msgstr "Bases de données récentes" #: src/Gui/MainWindow.cs:998 msgid "_Import" msgstr "_Importer" #: src/Gui/MainWindow.cs:1001 msgid "_Preferences" msgstr "_Préférences" #: src/Gui/MainWindow.cs:1004 msgid "_Database Properties" msgstr "_Propriétés BDD" #: src/Gui/MainWindow.cs:1007 msgid "Info" msgstr "Info" #: src/Gui/MainWindow.cs:1010 msgid "_Quit" msgstr "_Quitter" #: src/Gui/MainWindow.cs:1016 msgid "_Edit Volume" msgstr "_Editer Média" #: src/Gui/MainWindow.cs:1019 msgid "_Remove Volume" msgstr "_Supprimer Média" #: src/Gui/MainWindow.cs:1022 msgid "Rescan Volume" msgstr "" #: src/Gui/MainWindow.cs:1034 msgid "Sort by" msgstr "Trier par" #: src/Gui/MainWindow.cs:1037 msgid "Descending" msgstr "Décroissant" #: src/Gui/MainWindow.cs:1043 msgid "Date added" msgstr "Date d'ajout" #: src/Gui/MainWindow.cs:1044 msgid "Title" msgstr "Titre" #: src/Gui/MainWindow.cs:1045 msgid "Drivetype" msgstr "Type de lecteur" #: src/Gui/MainWindow.cs:1142 msgid "Filter volumes" msgstr "Filtrer les médias" #: src/Gui/Import.cs:29 msgid "Import" msgstr "Importer" #: src/Gui/Import.cs:30 msgid "Abort" msgstr "Abandonner" #: src/Gui/Import.cs:31 msgid "Please select a database." msgstr "Veuillez sélectionner une base de données." #: src/Gui/Import.cs:72 #, csharp-format msgid "{0:0}% completed." msgstr "{0:0}% réalisé" #: src/Gui/Import.cs:82 msgid "Import failed" msgstr "L'importation a échoué" #: src/Gui/Import.cs:85 msgid "Import failed!" msgstr "Erreur d'importation !" #: src/Gui/Import.cs:87 msgid "Import aborted." msgstr "Importation abandonnée." #: src/Gui/Import.cs:89 msgid "Import completed successfully." msgstr "Import terminé avec succès." #: src/Gui/Import.cs:121 msgid "Import in progress" msgstr "Importation en cours" #: src/Gui/Import.cs:122 msgid "You must stop the import before closing this window." msgstr "" "Vous devez arrêter l'importation en cours avant de fermer cette fenêtre." #: src/Gui/Import.cs:148 msgid "Unknown format." msgstr "Format inconnu." #: src/Gui/Import.cs:175 msgid "Import Database" msgstr "Import de la bases de données" #: src/Gui/Import.cs:186 msgid "Please select a database to import" msgstr "Sélectionnez une base de données à importer" #: src/Gui/Import.cs:194 msgid "All supported formats" msgstr "Tous les formats supportés" #: src/Gui/Import.cs:198 #, csharp-format msgid ".{0} files" msgstr ".{0} fichiers" #: src/Gui/Import.cs:209 msgid "Database:" msgstr "Base de données :" #: src/Gui/Import.cs:210 msgid "Format:" msgstr "Format :" #: src/Gui/ItemProperties.cs:29 msgid "Item Properties" msgstr "Propriétés de l'élément" #: src/Gui/VolumeScanner.cs:116 msgid "Scanning started." msgstr "Analyse démarrée." #: src/Gui/VolumeScanner.cs:118 #, csharp-format msgid "Scanning of drive '{0}' started." msgstr "Démarrage de l'analyse du lecteur '{0}'." #: src/Gui/VolumeScanner.cs:124 #, csharp-format msgid "" "Options: generate thumbs: {0}, extract metadata: {1}, discard symlinks: {2}, " "hashing: {3}." msgstr "" "Options : Génération miniatures : {0}, extraction 'metadata' : {1}, lien " "symboliques ignorés : {2}, 'hashing' : {3}." #: src/Gui/VolumeScanner.cs:131 #, csharp-format msgid "Options: MusicBrainz enabled: {0}" msgstr "Options : MusicBrainz activée : {0}" #: src/Gui/VolumeScanner.cs:157 msgid "Time" msgstr "Heure" #: src/Gui/VolumeScanner.cs:161 msgid "Message" msgstr "Message" #: src/Gui/VolumeScanner.cs:258 msgid "Stopping Scanner and performing rollback..." msgstr "Arrêt de l'annalyse et annulation des changements..." #: src/Gui/VolumeScanner.cs:268 msgid "yes" msgstr "oui" #: src/Gui/VolumeScanner.cs:268 msgid "no" msgstr "non" #: src/Gui/VolumeScanner.cs:291 msgid "Scan in progress" msgstr "Analyse en cours" #: src/Gui/VolumeScanner.cs:291 msgid "You must stop scanning before closing this window." msgstr "Vous devez arrêter l'analyse en cours avant de fermer cette fenêtre." #: src/Gui/VolumeScanner.cs:346 #, csharp-format msgid "An unhandled exception occured ({0})." msgstr "Une erreur non gérée est survenue ({0})." #: src/Gui/VolumeScanner.cs:347 msgid "All database changes have been rolled back." msgstr "Tous les changements de la base ont été annulés." #: src/Gui/VolumeScanner.cs:354 #, csharp-format msgid "Scanning failed. Reason: an unhandled exception occured ({0})." msgstr "Analyse échouée. Raison : une erreur non gérée est survenue ({0})." #: src/Gui/VolumeScanner.cs:356 msgid "Scanning aborted." msgstr "Analyse intérrompue." #: src/Gui/VolumeScanner.cs:358 msgid "Scanning completed successfully." msgstr "Analyse terminée avec succès." #: src/Gui/VolumeScanner.cs:488 msgid "VolumeScanner" msgstr "VolumeScanner" #: src/Gui/VolumeScanner.cs:500 msgid "Volume Information:" msgstr "Information sur le média :" #: src/Gui/VolumeScanner.cs:510 msgid "Scanner Log:" msgstr "Résultat de l'analyse :" #: src/Gui/VolumeScanner.cs:527 msgid "Database access" msgstr "Accès à la base de données" #: src/Gui/Preferences.cs:119 msgid "None" msgstr "Aucun" #: src/Gui/Preferences.cs:228 msgid "Unsupported theme" msgstr "Thème non pris en charge" #: src/Gui/Preferences.cs:229 msgid "The selected icon theme is currently not supported on your system." msgstr "" "Le thème d'icônes sélectionné n'est actuellement pas supporté par votre " "système." #: src/Gui/Preferences.cs:267 msgid "Restart required" msgstr "Redémarrage nécessaire" #: src/Gui/Preferences.cs:268 #, csharp-format msgid "You must restart {0} for icontheme changes to take effect." msgstr "Vous devez redémarrer {0} pour appliquer le changement du thème." #: src/Gui/Preferences.cs:298 msgid "Preferences" msgstr "Préférences" #: src/Gui/Preferences.cs:322 msgid "_Load Defaults" msgstr "_Charger défauts" #: src/Gui/Preferences.cs:349 msgid "Icon theme:" msgstr "Thème d'icônes :" #: src/Gui/Preferences.cs:355 msgid "Reopen most recent database on startup" msgstr "Réouvrir la dernière base de données au démarrage de l'application" #: src/Gui/Preferences.cs:359 msgid "Show iteminfo panel" msgstr "Afficher le panneau d'information des éléments" #: src/Gui/Preferences.cs:363 msgid "Show hidden files" msgstr "Afficher les fichiers cachés" #: src/Gui/Preferences.cs:367 msgid "Show thumbnails in the filebrowser" msgstr "Affiche les miniatures dans le navigateur de fichiers" #: src/Gui/Preferences.cs:370 msgid "General" msgstr "Général" #: src/Gui/Preferences.cs:378 msgid "Don't prompt, always scan:" msgstr "Toujours analyser sans confirmation :" #: src/Gui/Preferences.cs:397 msgid "Generate Thumbnails" msgstr "Génération des miniatures" #: src/Gui/Preferences.cs:401 msgid "Extract metadata" msgstr "Extraction des métadonnées" #: src/Gui/Preferences.cs:405 msgid "Discard symbolic links" msgstr "Ignorer les liens symboliques" #: src/Gui/Preferences.cs:409 msgid "Compute hashcodes for files (slow!)" msgstr "Calcule la somme de contrôle pour chaque fichier (plus lent !)" #: src/Gui/Preferences.cs:413 msgid "Fetch audio cd metadata from MusicBrainz.org" msgstr "Rechercher les données des CD Audio à partir de MusicBrainz.org" #: src/Gui/Preferences.cs:416 msgid "Scanner" msgstr "Scanner" Basenji/po/pl.resources0000664000175000017500000003312612067326706015312 0ustar patrickpatricklSystem.Resources.ResourceReader, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089#System.Resources.RuntimeResourceSetPADPADP̯[\ĒZFn_`/+ܽێyB_2 bJ䗖x~?ޘ ǚ˚}朮G  +Iљ,ޠ}ѬX`pѨE7kݏѝ!峸/# *?8 ڻMo;,锼xb5x,Qoĵgsv59}΍\$о DaрO51 թ}&ٍɬڴn^/gk䷧p$dF>?y7 Taq;͈nYDoY`rYrY$sYsYStYj~Ԕx06Z P4 * J  o> 8a c iz $ |q c O\mga}AKuQ>R j!ز$&P%%*U++1;v9`9vE:Iu:>Y@;CBsDH1L2Q;RfMSMeS@STXmޡY![[vk Tt ]DZ t  e E4}0P  `hVl"  w   ]N1s XZ|.  & ? QKix p '#+$"{0}" is {1}. Expected format: {2} Please correct or remove the data you entered.(empty)Z<b>Page {0}/{1}</b> ({2} - {3} of {4} items)&<b>Scanner Log:</b>!4<b>Volume Information:</b>; Abort[ Added:eVAll database changes have been rolled back.nAll filesAll items^An error occured while accessing drive {0}: {1}fAn error occured while loading the volume list: {0}JAn unhandled exception occured ({0}).3Applications_Archive No.iArchive No.:wArchivesvAre you sure you really want to remove the selected volume? ArtistAudio CDAudio CD trackAudiobooks Author Backup BytesCategoryCategory:*FCompute hashcodes for files (slow!)6Confirmation[CopyrightjCopyright (c) uCreated:Creator2Database '{0}' not found.&Database PropertiesDatabase accessFDatabase already exists. Overwrite?Database exists$Database not found*&Database not found.@Database:]Date addedkFDefault database not found. Create?yDescendingDescriptionDescription:DevelopmentDimensionsDirectoriesDirectories:Directory ,Discard symbolic linksDocuments(4Don't prompt, always scan:3 DriveNzDrive {0} is neither mounted nor does it contain an audio cd.V.Drive {0} is not ready.DrivetypeDurationDuration:Edit Item Error Extract metadataXFetch audio cd metadata from MusicBrainz.orgFile/File count5 Files:EFilesystemMFiletype]Filter volumesh FormatzFormat:DFound {0} items in {1:F3} seconds.GB GamesGeneral&Generate Thumbnails GenreHashHashed:Icon theme: Images ImportImport DatabaseImport aborted.0 POT-Creation-Date: 2012-07-15 15:49+0200 PO-Revision-Date: 2012-04-12 09:44+0000 Last-Translator: axel Language-Team: Polish MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Launchpad-Export-Date: 2012-10-27 11:00+0000 X-Generator: Launchpad (build 16194) R"{0}" to {1}. Spodziewany format: {2} Proszę poprawić lub usunąć podane dane.(pusta)2Strona {0}/{1} ({2} - {3} z {4} elementów)Dziennik Skanera:Informacje o woluminie:PrzerwijDodano:,Wszystkie zmiany w bazie zostały cofnięte.Wszystkie plikiWszystkie elementy3Wystąpił błąd podczas czytania napędu {0}: {1};Wystąpił błąd w czasie ładowania listy woluminów: {0}*Wystąpił nieobsługiwany wyjątek ({0}).Programy Archiwum nr: Archiwum nr:Archiwa3Czy jesteś pewny, że chcesz usunąć ten wolumin? WykonawcaPłyta CD AudioŚcieżka Audio CD AudiobookiAutorKopia zapasowaBajtów Kategoria Kategoria:#Generuj hash dla plików (powolne!) Potwierdzenie CopyrightCopyright (c)  Utworzony:Twórca#Baza '{0}' nie została znaleziona.Właściwości bazyDostęp do bazy danych&Baza danych już istnieje. Zastąpić?Baza danych istniejeBaza nie znaleziona.Baza danych nie znaleziona. Baza danych: Data dodania?Domyślna baza danych nie została znaleziona. Utworzyć nową? MalejącoOpisOpis:Narzędzia programistyczneWymiaryKatalogi Katalogi:KatalogUsuń dowiązania DokumentyNie pytaj, zawsze skanuj:Napęd:Napęd {0} nie jest zamontowany lub zawiera płytę audio.Napęd {0} nie jest gotowy. Typ napędu Długość Czas trwania:Edytuj elementBłądPobierz metadane,Pobierz metadane płyty CD z MusicBrainz.orgPlikLiczba plikówPliki:System plików Typ plikuFiltruj woluminyFormatFormat:*Znaleziono {0} elementów w {1:F3} sekund.GBGryOgólneGeneruj miniaturkiGatunekHash Shashowane: Zestaw ikon:ObrazyImportujImportuj bazę danychImportowanie przerwane.Importowanie zakończone.Importowanie nie powiodło się Importowanie nie powiodło się!Importowanie trwaNiepoprawne daneWłaściwości elementu Typ elementuKBSłowa kluczoweSłowa kluczowe:EtykietaJęzykData ostatniego zapisuWczytywanie...Data pożyczenia:Pożyczone od: PołożenieMB WiadomośćRóżneFilmyMuzykaNazwaNazwa:NieBrak elementów.Brak wyników wyszukiwania.BrakUwagaOtwórz domyślną bazę danychOpcjonalna nazwaOpcje: MusicBrainz aktywny: {0}ZOpcje: generuj miniatury: {0}, pobierz metadane: {1}, usuń dowiązania: {2}, hashuj: {3}.Inne Liczba stronObrazy0Proszę wprowadzić nazwę dla nowej bazy danychProszę wybrać bazę danych.Proszę wybrać bazę danych do zaimportowania(Proszę wybrać napęd do przeskanowania Preferencje ProducentOstatnio używane bazy danych0Otwórz ostatnią bazę danych przy uruchomieniuWymagane ponowne uruchomienie Data oddania:Skanowanie trwaSkanerSkanowanie przerwane.Skanowanie skończone.ISkanowanie nie powiodło się: wystąpił nieobsługiwany wyjątek ({0}).%Skanowanie napędy '{0}' rozpoczęte.Skanowanie rozpoczęte.Elementy WyszukiwaniaSzukaj przedmiotówWyszukiwanie...Wyświetlanie ukrytych plików%Pokaż panel informacji o przedmiocie)Pokaż miniaturki w przeglądarce plikówRozmiarOprogramowanie Sortuj wg'Zatrzymywanie Skanera i cofanie się...Cel dowiązaniaTBTekstDWybrany motyw ikon jest obecnie nie obsługiwany przez twój system.,Ta wersja bazy danych nie jest obsługiwana.CzasEOczekiwanie: prawdopodobnie wciąż działa inny proces wyszukiwania.TytułTytuł:BZbyt dużo wyników wyszukiwania. Proszę zredefiniować kryteria.Rozmiar całkowity: Ścieżka nr Ścieżki:TypNieznany Bez nazwy"Nieobsługiwana wersja bazy danychNieobługiwany motyw Używanie VolumeDB w wersji {0}.WideoWoluminWłaściwości woluminu Typ woluminu:Pliki baz danych woluminuSkaner woluminówOczekiwanie na napędy...RokTakJMusisz zrestartować {0} aby zmiany w zestawie ikony zostały zastosowane.@Musisz przerwać proces skanowania przed zamknięciem tego okna.6Musisz przerwać proces importu, by zamknąć to okno.Właściwości bazy _danych_Edytuj wolumin _ImportujWczytaj domyś_lne_Nowa baza danych_Otwórz bazę danych _PreferencjeZakończ Usuń woluminprzez domyślneplikówznieutworówtakSkończono {0:0}%. {0} Bajtów{0} już jest uruchomione.Załadowano {0} woluminów.Basenji/po/et.resources0000664000175000017500000003233312067326706015306 0ustar patrickpatricklSystem.Resources.ResourceReader, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089#System.Resources.RuntimeResourceSetPADPADP̯[\ĒZFn_`/+ܽێyB_2 bJ䗖x~?ޘ ǚ˚}朮G  +Iљ,ޠ}ѬX`pѨE7kݏѝ!峸/# *?8 ڻMo;,锼xb5x,Qoĵgsv59}΍\$о DaрO51 թ}&ٍɬڴn^/gk䷧p$dF>?y7 Taq;͈nYDoY`rYrY$sYsYStYj~Ԕx06Z P4 * J  o> 8a c iz $ |q c O\mga}AKuQ>R j!ز$&P%%*U++1;v9`9vE:Iu:>Y@;CBsDH1L2Q;RfMSMeS@STXmޡY![[vk Tt ]DZ t  e E4}0P  `hVl"  w   ]N1s XZ|.  & ? QKix p '#+$"{0}" is {1}. Expected format: {2} Please correct or remove the data you entered.(empty)Z<b>Page {0}/{1}</b> ({2} - {3} of {4} items)&<b>Scanner Log:</b>#4<b>Volume Information:</b>: AbortW Added:aVAll database changes have been rolled back.kAll filesAll items^An error occured while accessing drive {0}: {1}fAn error occured while loading the volume list: {0}JAn unhandled exception occured ({0}). Applications1Archive No.=Archive No.:JArchivesXvAre you sure you really want to remove the selected volume?b ArtistAudio CDAudio CD trackAudiobooks Author Backup BytesCategoryCategory:FCompute hashcodes for files (slow!)ConfirmationCopyright(Copyright (c) 8Created:KCreatorT2Database '{0}' not found.[&Database PropertiesxDatabase accessFDatabase already exists. Overwrite?Database exists$Database not found&Database not found.Database:Date addedFDefault database not found. Create?.DescendingYDescriptionqDescription:|DevelopmentDimensionsDirectoriesDirectories:Directory,Discard symbolic linksDocuments4Don't prompt, always scan: DrivezDrive {0} is neither mounted nor does it contain an audio cd..Drive {0} is not ready.0DrivetypeGDurationUDuration:]Edit Itemf Errort Extract metadatazXFetch audio cd metadata from MusicBrainz.orgFileFile count Files:FilesystemFiletypeFilter volumes  FormatFormat:%DFound {0} items in {1:F3} seconds./GBW Games[Generald&Generate Thumbnailsm Genre}HashHashed:Icon theme: Images ImportImport DatabaseImport aborted. POT-Creation-Date: 2012-07-15 15:49+0200 PO-Revision-Date: 2011-05-03 16:47+0000 Last-Translator: olavi tohver Language-Team: Estonian MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Launchpad-Export-Date: 2012-10-27 11:00+0000 X-Generator: Launchpad (build 16194) Q"{0}" on {1}. Oodatud formaat: {2} Palun paranda või eemalda sisestatud andmed.(tühi)+Leht {0}/{1} ({2} - {3} {4} kirjest)Skanneri logi:Ketta informatsioon:KatkestaLisatud:1Kõik andmebaasi muudatused on tagasi pööratud. Kõik failid Kõik kirjed#Ketta avamisel ilmnes viga {0}: {1},Ketaste nimekirja laadimisel ilmnes viga:{0}"Ilmnes käsitlematu olukord ({0}). Rakendused Arhiivi nr. Arhiivi nr.:Arhiivid/Oled kindel, et soovid valitud ketta kustutada?EsitajaAudio CD Audio CD lugu AudioraamatudAutorVarundaBaiti Kategooria Kategooria:(Arvuta failide kontrollsummad (aeglane!)KinnitusAutoriõigusedAutoriõigus (c) Loodud:AutorAndmebaasi '{0}' ei leitud.Andmebaasi omadusedAndmebaasi juurdepääs#Andmebaas on olemas. Kirjutan üle?Andmebaas eksisteeribAndmebaasi ei leitudAndmebaasi ei leitud. Andmebaas:Lisamise kuupäev)Vaikimisi andmebaasi ei leitud. Loon uue?Kahanevas järjestuses Kirjeldus Kirjeldus:Arendus Mõõtmed KataloogidKaustad:KataloogEira nimeviitasid DokumendidÄra küsi, alati skanni:Ketas1Ketas {0} pole ühendatud ega sisalda audio cd-d.Ketas {0}pole valmis. Ketta tüüpKestusKestus: Muuda kirjetViga$Eralda metaandmed (nt ID3, EXIF jne)/Tõmba audio cd metaandmeid MusicBrainz.org-st.Fail Failide arvFailid: Failisüsteem FailitüüpFiltreeri kettaidVormingVorming:&Leitud {0} kirje(t) {1:F3} sekundiga.GBMängudÜldineLoo pisipildidŽanr KontrollsummaKontrollsumma: Ikooniteema:PildidImpordiImpordi andmebaasImportimine katkestatud.Importimine lõppes edukalt.Tõrge importimiselImportimine nurjus!Importimine käibVigased andmedKirje omadused Kirje tüüpKB Märksõnad Märksõnad:SiltKeelViimati muudetud Laadimine...Laenamise aeg:Kellele laenatud:AsukohtMBTeade MitmesugustFilmidMuusikaNimiNimi:Ei Pole kirjeid.Otsingutulemusi pole.PuudubMärkmedAva vaikimisi andmebaas OptionName$Valik: MusicBrainZ aktiveeritud: {0}bValikud: loo pisipildid: {0}, kuva metaandmeid: {1}, loobu nimeviitadest: {2}, kontrollsumma: {3}.Muu Lehtede arvPildidPalun sisesta andmebaasile nimiPalun vali andmebaas"Palun vali importimiseks andmebaasPalun vali skaneerimiseks ketas Eelistused ProdutsentHiljutised andmebaasid,Käivitusel taasava kõige hilisem andmebaasVajalik taaskäivitusTagastamise aeg:Skaneerimine töötabSkannerSkaneerimine tühistatud.Skanerimine lõpetatud edukalt.>Skaneerimine nurjus. Põhjus: Ilmnes käsitlematu olukord {0}.#Ketta {0} skaneerimine käivitatud.Skaneerimine käivitatud.Kirjete otsimine Otsi kirjeid Otsimine...Näita peidetud faileNäita kirjete infopaneeli&Näita pisipilte failisirvija paneelilSuurusTarkvara Järjesta3Skaneerimine peatatakse ja taastatake algne olek...Nimeviida sihtmärkTBTekst;Valitud ikooniteema ei ole hetkel teie süsteemis toetatud.%Seda andmebaasi versiooni ei toetata.Aeg1Aegumine: teine otsing on tõenäoliselt pooleli.Pealkiri Pealkiri:BLiiga palju otsingutulemusi. Palun täpsusta otsingu parameetreid. Kogu maht:Raja nr.Rajad:TüüpTundmatuNimetuToetuseta andmebaasi versioonSobimatu teemaKasutab VolumeDB v{0}.VideodKöideKöite omadused Ketta tüüp:VolumeDatabase failid (.vdb) KettaskannerOotan kettaid...AastaJahDTe peate taaskäivitama {0} , et ikooniteema muudatused rakenduksid.7Enne selle akna sulgemist peate skaneerimise lõpetama.8Enne selle akna sulgemist pead sa importimise lõpetama.An_dmebaasi omadused _Muuda ketas_Impordi_Lae vaikeseaded_Uus andmebaas_Ava andmebaas _Eelistused_VäljuEemal_da ketas Kelle poolt vaikimisifailidallikasteipaladjah{0:0}% valmis. {0} baiti{0} juba töötab.{0} köidet laaditud.Basenji/po/tr.resources0000664000175000017500000001652212067326706015325 0ustar patrickpatricklSystem.Resources.ResourceReader, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089#System.Resources.RuntimeResourceSetPADPADP[\ĒZFnܽyB_2J䗖x~ ǚ˚G  +Iљ,ޠ}ѬX`E7kݏѝ!峸/ *? ,锼5x,Qosv}΍\$о DЀO}&ٍɬڴng䷧p$󄪧F>?y7 Taq;͈DoY`rYrY$sYsYStYj6P4 * J  o> c iz $ |q c ga}Q>R &P%%U++1;v9`9vE:Iu:>;CBsD1L;RMeS@SX![_㦍aObfZgahj8l[lpLsxUuxjv~|q|oт|т|؂|}$|xT|e|)|*#| u: RB n KN1 :S =R9 4  {  d Q -  Pz\ sc p;  7 vgx # CkKdg cz( C  \ !o6  'fw  TI \-ZD V I(empty)&<b>Scanner Log:</b> Abort Added:All filesAll itemsApplicationsArchive No.Archive No.: Archives  Artist+Audio CD6Audio CD trackA AuthorS BackupZ BytesaConfirmationgCopyrightsCopyright (c) zCreated:Creator2Database '{0}' not found.&Database PropertiesDatabase accessFDatabase already exists. Overwrite?Database exists"$Database not found6&Database not found.ODatabase:iFDefault database not found. Create?wDescriptionDescription:DevelopmentDimensionsDirectoriesDirectories:DirectoryDocuments Drive.Drive {0} is not ready.Duration&Duration:-Edit Item5 ErrorFFileL Files:SFilesystem^Filetypem Format{Format:DFound {0} items in {1:F3} seconds.GBGeneral GenreIcon theme: Images ImportImport DatabaseImport aborted. POT-Creation-Date: 2012-07-15 15:49+0200 PO-Revision-Date: 2010-07-10 13:47+0000 Last-Translator: Cihan Ersoy Language-Team: Turkish MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Launchpad-Export-Date: 2012-10-27 11:00+0000 X-Generator: Launchpad (build 16194) (boş)Tarayıcı Kaydı:Bitirmeden durdurEkleme: Tüm dosyalar Tüm Ögeler Uygulamalar Arşiv No.Arşiv Numarası: Arşivler Sanatçı Ses CD'siSes CD parçasıYazarYedekBayt DoğrulamaTelifTelif Hakkı (c)  Oluşturuldu: OluşturanVeritabanı '{0}' bulunamadı.Veritabancı ÖzellikleriVeritabanı erişimi'Veritabanı zaten mevcut. Üzerine yaz?Veritabanı mevcutVeritabanı bulunamadıVeritabını bulunamadı Veritabanı:/Öntanımlı veritabanı bulunamadı. Oluştur?Tanım Açıklama: GeliştirmeBoyutlarDizinler Dizinler:DizinBelgeler Sürücü{0} sürücüsü hazır değil.SüreSüre:Ögeyi DüzenleHataDosya Dosyalar: Dosya Sistemi Dosya türüBiçimFormat:!{1:F3} saniyede {0} öge bulundu.GBGenelTarzSimge teması: Görüntüler İçe aktarVeritabanı Al'İçe aktarma tamamlanmadan durduruldu.2İçe aktarma başarılı bir şekilde tamamlandıİçe aktarma başarısız olduİçe aktarma başarısız olduİçe aktarma devam ediyorGeçersiz veriÖge Özellikleri Öge türüKBAnahtar kelimelerAnahtar kelimeler:EtiketDilSon yazma zamanıYükleniyor...KonumMBİleti ÇeşitliFilmlerMüzikİsimİsim:Hayır Öge yok.HiçbiriNotÖntanımlı Veritabanını AçDiğerResimler-Yeni veritabanı için lütfen bir isim girinLütfen bir veritabanı seçin3İçe aktarmak için lütfen bir veritabanı seçin*Lütfen taramak için bir sürücü seçin Tercihler YapımcıŞu Anki VeritabanıYeniden başlatma gerekiyor TarayıcıTarama iptal edildi.Tarama başarıyla tamamlandı.Tarama başlatıldı. Aranıyor...Boyut YazılımTBMetin(Bu veritabanı sürümü desteklenmiyor.Süre Başlık: Toplam boyut: Parça No. Parçalar:Tür BilinmeyenAdlandırılmamış$Desteklenmeyen veritabanı sürümüSürücüler bekleniyor...YılEvet_Veritabanı Özellikleri _İçe aktarÖntanımlı Ayarları _Yükle_Yeni VeritabanıVeritabanı _Aç _Tercihler_Çıkdosyalarhayır parçalarevet%{0:0} tamamlandı.{0} Bayt{0} zaten çalışıyor.Basenji/po/es.resources0000664000175000017500000003564512067326706015316 0ustar patrickpatricklSystem.Resources.ResourceReader, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089#System.Resources.RuntimeResourceSetPADPADP̯[\ĒZFn_`/+ܽێyB_2 bJ䗖x~?ޘi ǚ˚}朮G  +Iљ,ޠ}ѬX`pѨE7kxbݏѝ!峸/# *?8 ڻMo;,锼xb5x,QoċƵgsv59}΍\$о DaрO51 թ}&ٍɬڴn^/gk䷧ 4pz$dF>?y7 Taq;͈nYDoY`rYrY$sYsYStYj~Ԕx06ez Z P4 * J  o> 8a c iz $ |q c  O\mg:a}AKuQ>R j!ز$&P%%**U++SP.1;v9`9vE:Iu:>Y@;CBsDHI1L2Q;RfMSMeS@STXmޡY![[S]( =s- $u  ]`  u`:e^> 4T}z G n E.f +Y# 4 pH;{)? J  X ,=F c,QmO Oaw =r i  H+K P } &"{0}" is {1}. Expected format: {2} Please correct or remove the data you entered.(empty).{0} filesZ<b>Page {0}/{1}</b> ({2} - {3} of {4} items)&<b>Scanner Log:</b>S4<b>Volume Information:</b>rXA cross-platform media indexing/search tool. AbortAdd Volume Added:VAll database changes have been rolled back.All files5All itemsI*All supported formats\^An error occured while accessing drive {0}: {1}{fAn error occured while loading the volume list: {0}JAn unhandled exception occured ({0}).App Menu+ApplicationsDArchive No.RArchive No.:_ArchivespvAre you sure you really want to remove the selected volume?z ArtistAudio CDAudio CD trackAudiobooks Author Backup BytesCategoryCategory:+FCompute hashcodes for files (slow!)8ConfirmationiCopyrightxCopyright (c) Created:Creator2Database '{0}' not found.&Database PropertiesDatabase accessFDatabase already exists. Overwrite? Database exists:$Database not foundS&Database not found.pDatabase:Date addedFDefault database not found. Create?DescendingDescriptionDescription:Development$Dimensions0Directories=Directories:GDirectoryU,Discard symbolic linksaDocuments4Don't prompt, always scan: DrivezDrive {0} is neither mounted nor does it contain an audio cd..Drive {0} is not ready.DrivetypeDuration!Duration:,Edit Item8 ErrorI Extract metadataPXFetch audio cd metadata from MusicBrainz.orgcFileFile count Files:FilesystemFiletypeFilter volumes FormatFormat: DFound {0} items in {1:F3} seconds. GB? GamesC GeneralK &Generate ThumbnailsT Genreh Hashq Hashed:w Icon theme: Images Import Import Database Import aborted. {0}</b>'. 0Please select a database DPlease select a database to import 2Please select a database.; :Please select a drive to scane Preferences Producer Quick tip: Recent Databases LReopen most recent database on startup Rescan Volume Restart requiredReturn date:+ Scan in progressBScannerY"Scanning aborted.c@Scanning completed successfully.x|Scanning failed. Reason: an unhandled exception occured ({0}).@Scanning of drive '{0}' started."Scanning started. Search)Search Items1Search itemsCSearching...Q"Show hidden files^&Show in Main Windowx&Show iteminfo panelDShow thumbnails in the filebrowserSizeSoftwareSort by VStopping Scanner and performing rollback...Symlink target>TBPTextTThe selected icon theme is currently not supported on your system.[NThis database version is not supported.TimelTimeout: another search is probably still in progress. Title' Title:/xToo many search results. Please refine your search criteria.9Total size:Track No.Tracks:TypeUnknownUnknown format.Unnamed8Unsupported database version"Unsupported theme(Using VolumeDB v{0}.) Videos@ VolumeH"Volume PropertiesRVolume type:k(VolumeDatabase files|VolumeScanner*Waiting for drives...$Waiting for volumeYearYestYou must restart {0} for icontheme changes to take effect.dYou must stop scanning before closing this window.>hYou must stop the import before closing this window.s(_Database Properties_Edit Volume_Import_Load Defaults_New Database _Open Database!_Preferences7 _QuitF_Remove VolumeNbyadefaultf filesvfromno tracksyes"{0:0}% completed.{0} Bytes.{0} is already running.&{0} volumes loaded.Project-Id-Version: basenji Report-Msgid-Bugs-To: FULL NAME POT-Creation-Date: 2012-07-15 15:49+0200 PO-Revision-Date: 2012-11-13 00:40+0000 Last-Translator: Guillermo Espertino (Gez) Language-Team: Spanish MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Launchpad-Export-Date: 2012-11-18 12:32+0000 X-Generator: Launchpad (build 16278) O"{0}" es {1}. Formato esperado: {2} Corrija o elimine los datos que introdujo.(vacío) .{0} archivos4Página {0}/{1} ({2} - {3} de {4} artículos)Registro de Escaneado: Información de Unidades:@Una herramienta de búsqueda/indexado multi-plataforma de mediosAnularAgregar Volumen Añadido:9Todos los cambios a la base de datos han sido revertidos.Todos los archivosTodos los objetosTodos los formatos soportados:Ocurrió un error mientras se accedia a la unidad {0}: {1}DUn error ocurrió mientras se cargaba la lista de de volúmenes: {0},Una inmanejable excepción a ocurrido ({0}).Menú de la Aplicación Aplicaciones Archivo No.Nº de Archivo:ArchivosH¿Está realmente seguro de que quiere eliminar el volumen seleccionado?Artista CD de AudioPista de CD de Audio AudiolibrosAutorCopia de SeguridadBytes Categoría Categoría:/Computar hashcodes para los archivos (¡lento!) ConfirmaciónDerechos de autorCopyright (c) Creado:Creador"Base de datos '{0}' no encontrada.Propiedades de la base de datosAcceso a la Base de Datos+La base de datos ya existe. ¿Sobrescribir?La base de datos existeBase de datos no encontradaBase de datos no encontrada.Base de datos:Fecha de AñadidoHLa base de datos predeterminada no se ha encontrado. ¿Quiere crear una? Descendente Descripción Descripción Desarrollo DimensionesCarpetas Directorios: DirectorioDescartar enlaces simbólicos DocumentosNo preguntar, escanear siempre:Unidad;El drive {0} no esta montado o no contiene un cd de audio..La unidad {0} no está lista.Tipo de Unidad Duración Duración:Editar ElementoErrorExtraer metadatos5Buscar metadata del cd de audio desde MusicBrainz.orgArchivoConteo de archivos Archivos:Sistema de archivosTipo de archivoFiltrar volúmenesFormatoFormato:.Encomntrados {0} elementos en {1:F3} segundos.GBJuegosGeneralGenerar miniaturasGéneroHashHash almacenado:Tema de iconos: ImágenesImportarImportar base de datosImportación anulada#Importación finalizada con éxito.Error al importar¡Error al importar!Importación en progreso InformaciónDatos inválidosPropiedades del elementoTipo de elementoKBPalabras clavePalabras clave:EtiquetaIdiomaÚltima fecha de escritura Cargando…Fecha de préstamo: Prestado a: UbicaciónMBMensaje Misceláneo PelículasMúsicaNombreNombre:NoSin artículos."No hay resultados de la búsqueda.NingunoNota"Abrir base de datos predeterminada OptionName%Opciones: MusicBrainz habilitado: {0}eOpciones: generar miniaturas: {0}, extraer metadata: {1}, descartar symlinks: {2}, generar hash: {3}.OtrosConteo de páginas Fotografìas.Introduzca el nombre de la nueva base de datos*Por favor inserte el volumen '{0}'.Seleccione una base de datos1Por favor seleccione una base de datos a importar(Por favor, seleccione una base de datos.#Seleccione una unidad para escanear Preferencias ProductorConsejo rápido:Bases de datos recientes,Abrir base de datos más reciente al iniciarReanalizar el VolumenSe requiere reiniciarFecha de devolución:Escaneado en progresoEscánerEscaneado abortado.,El escaneado se completo satisfactoriamente.KEl escaneo ha fallado. Razón: Una excepción inesperada ha ocurrido ({0}).!Escaneo del disco '{0}' iniciado.Escaneo iniciado.BuscarBuscar Elementos Buscar items Buscando...Mostrar archivos ocultosMostrar en la Ventana Principal(Mostrar panel de información del ítem./Mostrar miniaturas en el explorador de archivosTamaño Aplicaciones Ordenar por$Deteniendo escáner y revirtiendo...Objetivo SymlinkTBTextoKEl tema de íconos actualmente seleccionado no es soportado por su sistema.5La versión de esta base de datos no está soportada.Tiempo>Tiempo agotado: probablemente haya otra búsqueda en progreso.TituloTítulo:VDemasiados resultados para la búsqueda. Por favor, refine sus criterios de búsqueda.Tamaño total: Pïsta No.Pistas:Tipo DesconocidoFormato desconocido. Sin nombre)Versión de la base de datos no soportadaTema no soportadoUsando VolumeDB v{0}.VideosVolúmenPropiedades del volumenTipo de unidad:%Archivos de base de datos del volumenEscaneador de UnidadesEsperando unidades...Esperando el volumenAñoSíIDebe reiniciar {0} para que tengan efecto los cambios del tema de iconos.3Debe detener el escaneado para cerrar esta ventana.:Debe detener la importación antes de cerrar esta ventana. _Propiedades de la Base de Datos_Editar volumen _Importar_Cargar opciones por defecto_Nueva Base de Datos_Abrir base de datos _Preferencias_Salir_Eliminar volumenporpredeterminadoarchivosdenopistassi{0:0}% completado. {0} Bytes{0} ya se está ejecutando.{0} volúmenes cargados.Basenji/po/pt_BR.resources0000664000175000017500000003447212067326706015712 0ustar patrickpatricklSystem.Resources.ResourceReader, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089#System.Resources.RuntimeResourceSetPADPADP̯[\ĒZFn_`/+ܽێyB_2 bJ䗖x~?ޘ ǚ˚}朮G  +Iљ,ޠ}ѬX`pѨE7kݏѝ!峸/# *?8 ڻMo;,锼xb5x,Qoĵgsv59}΍\$о DaрO51 թ}&ٍɬڴn^/gk䷧p$dF>?y7 Taq;͈nYDoY`rYrY$sYsYStYj~Ԕx06ez Z P4 * J  o> 8a c iz $ |q c O\mga}AKuQ>R j!ز$&P%%*U++1;v9`9vE:Iu:>Y@;CBsDH1L2Q;RfMSMeS@STXmޡY![[Page {0}/{1}</b> ({2} - {3} of {4} items)&<b>Scanner Log:</b>B4<b>Volume Information:</b>dXA cross-platform media indexing/search tool. Abort Added:VAll database changes have been rolled back.All files$All items7^An error occured while accessing drive {0}: {1}GfAn error occured while loading the volume list: {0}|JAn unhandled exception occured ({0}).ApplicationsArchive No. Archive No.:Archives(vAre you sure you really want to remove the selected volume?2 ArtistqAudio CDzAudio CD trackAudiobooks Author Backup BytesCategoryCategory:FCompute hashcodes for files (slow!)ConfirmationCopyright(Copyright (c) ;Created:SCreator_2Database '{0}' not found.h&Database PropertiesDatabase accessFDatabase already exists. Overwrite?Database exists$Database not found&Database not found.7Database:XDate addediFDefault database not found. Create?|DescendingDescriptionDescription:DevelopmentDimensionsDirectoriesDirectories: Directory,Discard symbolic linksDocuments54Don't prompt, always scan:A DrivepzDrive {0} is neither mounted nor does it contain an audio cd.y.Drive {0} is not ready.DrivetypeDurationDuration:Edit Item Error  Extract metadataXFetch audio cd metadata from MusicBrainz.org&FilegFile countp Files:FilesystemFiletypeFilter volumes FormatFormat:DFound {0} items in {1:F3} seconds.GB Games General &Generate Thumbnails! Genre3 Hash< Hashed:B Icon theme:P Imagesc Importl Import Databasev Import aborted. NoteF *Open Default DatabaseL OptionNamej BOptions: MusicBrainz enabled: {0}{ Options: generate thumbs: {0}, extract metadata: {1}, discard symlinks: {2}, hashing: {3}. Other" Page count* Pictures? TPlease enter the name for the new databaseH 0Please select a database DPlease select a database to import :Please select a drive to scan Preferences Producer Recent Databases# LReopen most recent database on startup= Restart required Return date: Scan in progress Scanner "Scanning aborted. @Scanning completed successfully. |Scanning failed. Reason: an unhandled exception occured ({0}).@Scanning of drive '{0}' started.y"Scanning started.Search ItemsSearch itemsSearching..."Show hidden files&Show iteminfo panel DShow thumbnails in the filebrowser6SizeeSoftwarenSort by{VStopping Scanner and performing rollback...Symlink targetTBTextThe selected icon theme is currently not supported on your system.NThis database version is not supported.)Time`lTimeout: another search is probably still in progress.f Title Title:xToo many search results. Please refine your search criteria.Total size:Track No. Tracks:,Type5Unknown;UnnamedI8Unsupported database versionS"Unsupported theme(Using VolumeDB v{0}. Videos Volume"Volume PropertiesVolume type:(VolumeDatabase filesVolumeScanner4*Waiting for drives...UYearpYesutYou must restart {0} for icontheme changes to take effect.zdYou must stop scanning before closing this window.hYou must stop the import before closing this window.(_Database Properties\_Edit Volume}_Import_Load Defaults_New Database_Open Database_Preferences _Quit_Remove Volume by$default) files2from<no@ tracksFyesN"{0:0}% completed.S{0} Bytesh.{0} is already running.s&{0} volumes loaded.Project-Id-Version: basenji Report-Msgid-Bugs-To: FULL NAME POT-Creation-Date: 2012-07-15 15:49+0200 PO-Revision-Date: 2012-01-06 18:32+0000 Last-Translator: Ulisses de C. Soares Language-Team: Brazilian Portuguese MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Launchpad-Export-Date: 2012-10-27 11:00+0000 X-Generator: Launchpad (build 16194) U"{0}" é {1}. Formato esperado: {2} Por favor corrija ou remova os dados fornecidos.(vazio)/Página {0}/{1} ({2} - {3} de {4} itens) Registro de escaneamento:)Informações do volume de mídia:@Uma ferrammenta de busca/indexação de mídia multi-plataforma.Cancelar Adicionado::Todas as alterações nos bancos de dados foram desfeitas.Todos os arquivosTodos os itens3Ocorreu um erro durante o acesso a unidade {0}: {1}GOcorreu um erro enquanto estava sendo carregada a lista de volumes: {0}9Ocorreu uma exceção que não pôde ser resolvida ({0}). Aplicativos Arquivo nº Arquivo nº:Arquivos=Você tem certeza de que deseja remover o volume selecionado?Artista CD de áudioFaixa de áudio de CDLivros em áudioAutorCópia de segurançaBytes Categoria Categoria:+Calcule hashcodes para os arquivos (lento!) ConfirmaçãoDireitos autoraisDireitos autorais (c)  Criado em:Criador+O banco de dados '{0}' não foi encontrado.Propriedades do banco de dadosAcesso ao banco de dados+Banco de dados já existente. Sobrescrever?Banco de dados existenteBanco de dados não encontrado.Banco de dados não encontrado.Banco de dados:Data de criação>Banco de dados padrão não encontrado. Deseja criar um agora? Descendente Descrição Descrição:Desenvolvimento DimensõesPastasPastas:PastaDescarte links simbólicos Documentos-Não pergunte, sempre realize o escaneamento:Unidade=A unidade {0} não está montada nem contém um cd de áudio.Unidade {0} não está pronta.Tipo de unidade Duração Duração: Editar ItemErroExtrair metadados?Contactar MusicBrainz.org para obter metadados de cds de áudioArquivoNúmero de arquivos Arquivos:Sistema de arquivosTipo de arquivoFiltrar volumes de mídiaFormatoFormato:)Encontrados {0} itens em {1:F3} segundos.GBJogosGeralGerar miniaturasGêneroHash Hash gerado:Tema dos ícones:ImagensImportarImportar banco de dadosImportação cancelada.$Importação completada com sucesso.Falha ao importarFalha ao importar!Importação em andamentoDados inválidosPropriedades do item Tipo de itemkBPalavras-chavePalavras-chave:RótuloIdiomaModificado pela última vez Carregando...Data do empréstimo:Emprestado para:LocalMBMensagemDiversosFilmesMúsicasNomeNome:Não Sem itens.Nenhum resultado encontrado.NenhumNotaAbrir banco de dados padrãoNome da opção'Preferências: MusicBrainz ativado: {0}|Preferências: gerar miniaturas: {0}, extrair metadados: {1}, descartar links simbólicos: {2}, criar códigos de hash: {3}.OutrosNúmero de páginasImagens5Por favor forneça um nome para o novo banco de dados#Por favor escolha um banco de dados7Por favor selecione um banco de dados para importação+Por favor escolha uma unidade para escanear PreferênciasProdutorBancos de dados recentesEAbrir novamente o banco de dados mais recente durante inicializaçãoReinicialização requeridaData de devolução:Escaneamento em andamento EscaneamentoEscaneamento cancelado.$Escaneamento finalizado com sucesso.XO escaneamento falhou. Motivo: ocorreu uma exceção que não pôde ser resolvida ({0}).*Iniciando o escaneamento da unidade '{0}'.Iniciando o escaneamento.Pesquisar itensPesquisar itensPesquisando...Exibir arquivos ocultos)Mostrar painel de informações dos itens-Mostre miniaturas no visualizador de arquivosTamanho Aplicativos Ordenar por:Interrompendo escaneamento e desfazendo as alterações...Alvo do link simbólicoTBTexto?Não há suporte para o tema de ícones selecionado no sistema.5Não há suporte para esta versão do banco de dados.Hora@Tempo esgotado: provavelmente outra pesquisa está em andamento.TítuloTítulo:SQuantidade excessiva de resultados. Por favor aprimore seus critérios de pesquisa.Tamanho total: Faixa nº:Faixas:Tipo DesconhecidoSem nome5Não há suporte para esta versão do banco de dados.Não há suporte a este temaUtiliza VolumeDB v{0}.VídeosVolume de mídia Propriedades do volume de mídiaTipo de volume de mídia:Arquivos do VolumeDatabaseEscaneador de volumes de mídiaAguardando as unidades...AnoSimXVocê deve reinicializar {0} para que a alteração no tema dos ícones entre em efeito.BVocê deve interromper o escaneamento antes de fechar esta janela.BVocê deve interromper a importação antes de fechar esta janela.Propriedades do banco de _dadosEditar volume de _mídia Impor_tar!_Carregar configurações padrão_Novo banco de dadosAbrir _banco de dados_Preferências_Sair_Remover Volume de MídiaporPadrãoarquivosdenãofaixassim{0:0}% completados. {0} Bytes{0} já está em execução.{0} volumes carregados.Basenji/po/zh_CN.po0000664000175000017500000004505112067326706014304 0ustar patrickpatrick# Chinese (Simplified) translation for basenji # Copyright (c) 2010 Rosetta Contributors and Canonical Ltd 2010 # This file is distributed under the same license as the basenji package. # FIRST AUTHOR , 2010. # msgid "" msgstr "" "Project-Id-Version: basenji\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2012-07-15 15:49+0200\n" "PO-Revision-Date: 2010-12-12 23:42+0000\n" "Last-Translator: Li Jin \n" "Language-Team: Chinese (Simplified) \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2012-10-27 11:00+0000\n" "X-Generator: Launchpad (build 16194)\n" #: src/Util.cs:30 #, csharp-format msgid "{0} Bytes" msgstr "" #: src/Util.cs:32 msgid "Bytes" msgstr "字节" #: src/Util.cs:32 msgid "KB" msgstr "KB" #: src/Util.cs:32 msgid "MB" msgstr "兆字节" #: src/Util.cs:32 msgid "GB" msgstr "" #: src/Util.cs:32 msgid "TB" msgstr "" #: src/Options.cs:477 msgid "OptionName" msgstr "选项名" #: src/FileDialog.cs:51 msgid "VolumeDatabase files" msgstr "" #: src/FileDialog.cs:56 msgid "All files" msgstr "所有文件" #: src/Main.cs:142 src/Gui/MainWindow.cs:76 src/Gui/MainWindow.cs:92 #: src/Gui/MainWindow.cs:334 src/Gui/MainWindow.cs:355 #: src/Gui/MainWindow.cs:377 src/Gui/MainWindow.cs:386 #: src/Gui/MainWindow.cs:635 msgid "Error" msgstr "错误" #: src/Main.cs:142 #, csharp-format msgid "{0} is already running." msgstr "{0} 已在运行中。" #: src/Gui/Widgets/VolumeView.cs:42 src/Gui/Widgets/SearchResultView.cs:30 msgid "Unnamed" msgstr "未命名" #: src/Gui/Widgets/VolumeView.cs:43 #: src/Gui/Widgets/Editors/VolumeEditor.cs:259 msgid "Category:" msgstr "" #: src/Gui/Widgets/VolumeView.cs:44 msgid "files" msgstr "" #: src/Gui/Widgets/VolumeView.cs:45 msgid "tracks" msgstr "曲目" #: src/Gui/Widgets/ItemView.cs:29 msgid "Loading..." msgstr "载入中..." #: src/Gui/Widgets/ItemView.cs:30 msgid "(empty)" msgstr "" #: src/Gui/Widgets/ItemView.cs:99 src/Gui/DriveSelection.cs:80 msgid "Unknown" msgstr "未知" #: src/Gui/Widgets/ItemView.cs:170 src/Gui/Widgets/Editors/ItemEditor.cs:96 msgid "Name" msgstr "" #: src/Gui/Widgets/ItemView.cs:176 msgid "Artist" msgstr "艺术家" #: src/Gui/Widgets/ItemView.cs:181 #: src/Gui/Widgets/Editors/AudioTrackItemEditor.cs:53 #: src/Gui/Widgets/ItemInfo.cs:225 src/Gui/Widgets/ItemInfo.cs:288 msgid "Duration" msgstr "时长" #: src/Gui/Widgets/Editors/FileSystemVolumeEditor.cs:34 #: src/Gui/DriveSelection.cs:168 msgid "Filesystem" msgstr "文件系统" #: src/Gui/Widgets/Editors/FileSystemVolumeEditor.cs:65 msgid "Files:" msgstr "" #: src/Gui/Widgets/Editors/FileSystemVolumeEditor.cs:66 msgid "Directories:" msgstr "文件夹:" #: src/Gui/Widgets/Editors/FileSystemVolumeEditor.cs:67 msgid "Total size:" msgstr "总大小:" #: src/Gui/Widgets/Editors/ItemEditor.cs:95 msgid "Item type" msgstr "" #: src/Gui/Widgets/Editors/ItemEditor.cs:111 src/Gui/Widgets/ItemInfo.cs:371 msgid "Note" msgstr "" #: src/Gui/Widgets/Editors/ItemEditor.cs:112 src/Gui/Widgets/ItemInfo.cs:374 msgid "Keywords" msgstr "关键词" #: src/Gui/Widgets/Editors/AudioTrackItemEditor.cs:31 #: src/Gui/Widgets/SearchResultView.cs:34 msgid "Audio CD track" msgstr "音频CD音轨" #: src/Gui/Widgets/Editors/AudioTrackItemEditor.cs:54 #: src/Gui/Widgets/ItemInfo.cs:230 msgid "Type" msgstr "类型" #: src/Gui/Widgets/Editors/DirectoryItemEditor.cs:28 msgid "Directory" msgstr "文件夹" #: src/Gui/Widgets/Editors/FileSystemItemEditor.cs:59 #: src/Gui/Widgets/SearchResultView.cs:31 src/Gui/Widgets/ItemInfo.cs:183 msgid "Location" msgstr "位置" #: src/Gui/Widgets/Editors/FileSystemItemEditor.cs:60 #: src/Gui/Widgets/ItemInfo.cs:185 msgid "Last write time" msgstr "上次写入时间" #: src/Gui/Widgets/Editors/FileSystemItemEditor.cs:61 #: src/Gui/Widgets/ItemInfo.cs:210 msgid "Filetype" msgstr "文件类型" #: src/Gui/Widgets/Editors/FileItemEditor.cs:31 msgid "File" msgstr "文件" #: src/Gui/Widgets/Editors/FileItemEditor.cs:52 #: src/Gui/Widgets/ItemInfo.cs:204 src/Gui/Widgets/ItemInfo.cs:226 #: src/Gui/DriveSelection.cs:148 msgid "Size" msgstr "" #: src/Gui/Widgets/Editors/FileItemEditor.cs:53 #: src/Gui/Widgets/ItemInfo.cs:206 msgid "Hash" msgstr "" #: src/Gui/Widgets/Editors/AudioCdVolumeEditor.cs:33 msgid "Audio CD" msgstr "音频CD" #: src/Gui/Widgets/Editors/AudioCdVolumeEditor.cs:63 msgid "Tracks:" msgstr "" #: src/Gui/Widgets/Editors/AudioCdVolumeEditor.cs:64 msgid "Duration:" msgstr "时长:" #: src/Gui/Widgets/Editors/VolumeEditor.cs:45 msgid "Backup" msgstr "备份" #: src/Gui/Widgets/Editors/VolumeEditor.cs:46 #: src/Gui/Widgets/CategoryView.cs:60 msgid "Documents" msgstr "文档" #: src/Gui/Widgets/Editors/VolumeEditor.cs:47 #: src/Gui/Widgets/CategoryView.cs:61 msgid "Music" msgstr "音乐" #: src/Gui/Widgets/Editors/VolumeEditor.cs:48 msgid "Audiobooks" msgstr "有声书" #: src/Gui/Widgets/Editors/VolumeEditor.cs:49 #: src/Gui/Widgets/CategoryView.cs:62 msgid "Movies" msgstr "电影" #: src/Gui/Widgets/Editors/VolumeEditor.cs:50 msgid "Videos" msgstr "视频" #: src/Gui/Widgets/Editors/VolumeEditor.cs:51 msgid "Pictures" msgstr "图片" #: src/Gui/Widgets/Editors/VolumeEditor.cs:52 msgid "Games" msgstr "游戏" #: src/Gui/Widgets/Editors/VolumeEditor.cs:53 src/Gui/Widgets/ItemInfo.cs:319 msgid "Software" msgstr "软件" #: src/Gui/Widgets/Editors/VolumeEditor.cs:54 msgid "Misc" msgstr "杂项" #: src/Gui/Widgets/Editors/VolumeEditor.cs:55 msgid "Other" msgstr "其它" #: src/Gui/Widgets/Editors/VolumeEditor.cs:225 msgid "Yes" msgstr "确定" #: src/Gui/Widgets/Editors/VolumeEditor.cs:225 msgid "No" msgstr "取消" #: src/Gui/Widgets/Editors/VolumeEditor.cs:235 msgid "Volume type:" msgstr "" #: src/Gui/Widgets/Editors/VolumeEditor.cs:236 msgid "Hashed:" msgstr "" #: src/Gui/Widgets/Editors/VolumeEditor.cs:237 msgid "Added:" msgstr "已添加:" #: src/Gui/Widgets/Editors/VolumeEditor.cs:258 msgid "Archive No.:" msgstr "存档编号:" #: src/Gui/Widgets/Editors/VolumeEditor.cs:260 msgid "Title:" msgstr "标题:" #: src/Gui/Widgets/Editors/VolumeEditor.cs:261 src/Gui/DBProperties.cs:98 msgid "Description:" msgstr "描述:" #: src/Gui/Widgets/Editors/VolumeEditor.cs:262 msgid "Keywords:" msgstr "关键词:" #: src/Gui/Widgets/Editors/VolumeEditor.cs:263 msgid "Loaned to:" msgstr "租给:" #: src/Gui/Widgets/Editors/VolumeEditor.cs:264 msgid "Loaned date:" msgstr "" #: src/Gui/Widgets/Editors/VolumeEditor.cs:265 msgid "Return date:" msgstr "" #: src/Gui/Widgets/CategoryView.cs:58 msgid "Directories" msgstr "" #: src/Gui/Widgets/CategoryView.cs:59 msgid "Text" msgstr "文本" #: src/Gui/Widgets/CategoryView.cs:63 msgid "Images" msgstr "图像" #: src/Gui/Widgets/CategoryView.cs:64 msgid "Applications" msgstr "程序" #: src/Gui/Widgets/CategoryView.cs:65 msgid "Archives" msgstr "存档" #: src/Gui/Widgets/CategoryView.cs:66 msgid "Development" msgstr "" #: src/Gui/Widgets/CategoryView.cs:96 src/Gui/MainWindow.cs:1046 msgid "Category" msgstr "" #: src/Gui/Widgets/CategoryView.cs:128 msgid "All items" msgstr "" #: src/Gui/Widgets/SearchResultView.cs:32 msgid "Volume" msgstr "" #: src/Gui/Widgets/SearchResultView.cs:33 src/Gui/MainWindow.cs:1040 msgid "Archive No." msgstr "" #: src/Gui/Widgets/ItemInfo.cs:40 msgid "by" msgstr "由" #: src/Gui/Widgets/ItemInfo.cs:41 msgid "from" msgstr "从" #: src/Gui/Widgets/ItemInfo.cs:196 msgid "Symlink target" msgstr "" #: src/Gui/Widgets/ItemInfo.cs:227 msgid "Track No." msgstr "" #: src/Gui/Widgets/ItemInfo.cs:258 msgid "Genre" msgstr "流派" #: src/Gui/Widgets/ItemInfo.cs:278 msgid "Year" msgstr "年份" #: src/Gui/Widgets/ItemInfo.cs:283 msgid "Description" msgstr "描述" #: src/Gui/Widgets/ItemInfo.cs:294 msgid "Dimensions" msgstr "尺寸" #: src/Gui/Widgets/ItemInfo.cs:299 msgid "Format" msgstr "格式" #: src/Gui/Widgets/ItemInfo.cs:303 msgid "Author" msgstr "作者" #: src/Gui/Widgets/ItemInfo.cs:307 msgid "Copyright" msgstr "版权" #: src/Gui/Widgets/ItemInfo.cs:311 msgid "Producer" msgstr "制作人" #: src/Gui/Widgets/ItemInfo.cs:315 msgid "Creator" msgstr "创建人" #: src/Gui/Widgets/ItemInfo.cs:323 msgid "Language" msgstr "语言" #: src/Gui/Widgets/ItemInfo.cs:327 msgid "Page count" msgstr "页数" #: src/Gui/Widgets/ItemInfo.cs:346 msgid "File count" msgstr "文件数" #: src/Gui/Widgets/PageNavigation.cs:27 msgid "No items." msgstr "" #: src/Gui/Widgets/PageNavigation.cs:145 #, csharp-format msgid "Page {0}/{1} ({2} - {3} of {4} items)" msgstr "页 {0}/{1} ({2} - {3} 共 {4} 项)" #: src/Gui/ObjectProperties.cs:54 src/Gui/VolumeScanner.cs:248 msgid "Invalid data" msgstr "数据无效" #: src/Gui/ObjectProperties.cs:54 src/Gui/VolumeScanner.cs:249 #, csharp-format msgid "" "\"{0}\" is {1}.\n" "\n" "Expected format: {2}\n" "Please correct or remove the data you entered." msgstr "" #: src/Gui/DBProperties.cs:85 msgid "Database Properties" msgstr "数据库属性" #: src/Gui/DBProperties.cs:97 msgid "Name:" msgstr "" #: src/Gui/DBProperties.cs:99 msgid "Created:" msgstr "创建时间:" #: src/Gui/VolumeProperties.cs:29 msgid "Volume Properties" msgstr "音量属性" #: src/Gui/DriveSelection.cs:60 msgid "Waiting for drives..." msgstr "等待驱动器..." #: src/Gui/DriveSelection.cs:133 msgid "Drive" msgstr "驱动器" #: src/Gui/DriveSelection.cs:139 msgid "Label" msgstr "卷标" #: src/Gui/DriveSelection.cs:241 msgid "Please select a drive to scan" msgstr "请选择要扫描的磁盘" #: src/Gui/About.cs:28 msgid "A cross-platform media indexing/search tool." msgstr "" #: src/Gui/About.cs:29 #, csharp-format msgid "Using VolumeDB v{0}." msgstr "" #: src/Gui/About.cs:31 msgid "Copyright (c) " msgstr "版权所有 (c) " #: src/Gui/ItemSearch.cs:81 #, csharp-format msgid "Found {0} items in {1:F3} seconds." msgstr "" #: src/Gui/ItemSearch.cs:92 src/Gui/MainWindow.cs:519 msgid "Timeout: another search is probably still in progress." msgstr "" #: src/Gui/ItemSearch.cs:94 msgid "Too many search results. Please refine your search criteria." msgstr "" #: src/Gui/ItemSearch.cs:112 src/Gui/MainWindow.cs:535 msgid "Searching..." msgstr "正在搜索......" #: src/Gui/ItemSearch.cs:267 msgid "Search Items" msgstr "搜索项目" #: src/Gui/ItemSearch.cs:279 src/Gui/MainWindow.cs:1145 msgid "default" msgstr "" #: src/Gui/ItemSearch.cs:283 msgid "Search items" msgstr "" #: src/Gui/ItemSearch.cs:318 msgid "Quick tip:" msgstr "" #: src/Gui/ItemSearch.cs:319 #, csharp-format msgid "" "Click on the icon to the left of the search field to build advanced search " "queries.\n" "Example: {0}" msgstr "" #: src/Gui/ItemSearch.cs:326 msgid "No search results." msgstr "没有搜索结果。" #: src/Gui/ItemSearch.cs:375 src/Gui/MainWindow.cs:1028 msgid "Edit Item" msgstr "编辑项" #: src/Gui/ItemSearch.cs:382 msgid "Show in Main Window" msgstr "" #: src/Gui/MainWindow.cs:77 src/Gui/MainWindow.cs:93 src/Gui/MainWindow.cs:635 #, csharp-format msgid "Database '{0}' not found." msgstr "" #: src/Gui/MainWindow.cs:185 msgid "Database not found" msgstr "" #: src/Gui/MainWindow.cs:186 msgid "Default database not found. Create?" msgstr "" #: src/Gui/MainWindow.cs:215 msgid "Unsupported database version" msgstr "" #: src/Gui/MainWindow.cs:216 msgid "This database version is not supported." msgstr "" #: src/Gui/MainWindow.cs:235 #, csharp-format msgid "{0} volumes loaded." msgstr "" #: src/Gui/MainWindow.cs:256 #, csharp-format msgid "An error occured while loading the volume list: {0}" msgstr "" #: src/Gui/MainWindow.cs:300 msgid "Please enter the name for the new database" msgstr "" #: src/Gui/MainWindow.cs:312 msgid "Database exists" msgstr "数据库已存在" #: src/Gui/MainWindow.cs:313 msgid "Database already exists. Overwrite?" msgstr "数据库已存在。是否覆盖?" #: src/Gui/MainWindow.cs:326 msgid "Please select a database" msgstr "请选择数据库" #: src/Gui/MainWindow.cs:335 src/Gui/Import.cs:83 msgid "Database not found." msgstr "数据库不存在" #: src/Gui/MainWindow.cs:356 #, csharp-format msgid "" "An error occured while accessing drive {0}:\n" "{1}" msgstr "" #: src/Gui/MainWindow.cs:378 #, csharp-format msgid "Drive {0} is not ready." msgstr "" #: src/Gui/MainWindow.cs:387 #, csharp-format msgid "Drive {0} is neither mounted nor does it contain an audio cd." msgstr "" #: src/Gui/MainWindow.cs:406 msgid "Confirmation" msgstr "确认" #: src/Gui/MainWindow.cs:407 msgid "Are you sure you really want to remove the selected volume?" msgstr "" #: src/Gui/MainWindow.cs:712 #, csharp-format msgid "Please insert volume '{0}'." msgstr "" #: src/Gui/MainWindow.cs:714 msgid "Waiting for volume" msgstr "" #: src/Gui/MainWindow.cs:966 msgid "Add Volume" msgstr "" #: src/Gui/MainWindow.cs:970 msgid "Search" msgstr "" #: src/Gui/MainWindow.cs:973 msgid "App Menu" msgstr "" #: src/Gui/MainWindow.cs:979 msgid "_New Database" msgstr "" #: src/Gui/MainWindow.cs:982 msgid "_Open Database" msgstr "打开数据库(_O)" #: src/Gui/MainWindow.cs:985 msgid "Open Default Database" msgstr "打开默认数据库" #: src/Gui/MainWindow.cs:991 msgid "Recent Databases" msgstr "" #: src/Gui/MainWindow.cs:998 msgid "_Import" msgstr "导入(_I)" #: src/Gui/MainWindow.cs:1001 msgid "_Preferences" msgstr "首选项(_P)" #: src/Gui/MainWindow.cs:1004 msgid "_Database Properties" msgstr "数据库属性(_D)" #: src/Gui/MainWindow.cs:1007 msgid "Info" msgstr "" #: src/Gui/MainWindow.cs:1010 msgid "_Quit" msgstr "退出 (_Q)" #: src/Gui/MainWindow.cs:1016 msgid "_Edit Volume" msgstr "编辑卷(_E)" #: src/Gui/MainWindow.cs:1019 msgid "_Remove Volume" msgstr "移除卷(_R)" #: src/Gui/MainWindow.cs:1022 msgid "Rescan Volume" msgstr "" #: src/Gui/MainWindow.cs:1034 msgid "Sort by" msgstr "" #: src/Gui/MainWindow.cs:1037 msgid "Descending" msgstr "递减" #: src/Gui/MainWindow.cs:1043 msgid "Date added" msgstr "添加日期" #: src/Gui/MainWindow.cs:1044 msgid "Title" msgstr "标题" #: src/Gui/MainWindow.cs:1045 msgid "Drivetype" msgstr "磁盘类型" #: src/Gui/MainWindow.cs:1142 msgid "Filter volumes" msgstr "过滤卷" #: src/Gui/Import.cs:29 msgid "Import" msgstr "导入" #: src/Gui/Import.cs:30 msgid "Abort" msgstr "中止" #: src/Gui/Import.cs:31 msgid "Please select a database." msgstr "" #: src/Gui/Import.cs:72 #, csharp-format msgid "{0:0}% completed." msgstr "" #: src/Gui/Import.cs:82 msgid "Import failed" msgstr "导入失败" #: src/Gui/Import.cs:85 msgid "Import failed!" msgstr "导入失败!" #: src/Gui/Import.cs:87 msgid "Import aborted." msgstr "导入已取消。" #: src/Gui/Import.cs:89 msgid "Import completed successfully." msgstr "成功完成导入。" #: src/Gui/Import.cs:121 msgid "Import in progress" msgstr "导入进行中" #: src/Gui/Import.cs:122 msgid "You must stop the import before closing this window." msgstr "关闭窗口前必须停止导入。" #: src/Gui/Import.cs:148 msgid "Unknown format." msgstr "" #: src/Gui/Import.cs:175 msgid "Import Database" msgstr "导入数据库" #: src/Gui/Import.cs:186 msgid "Please select a database to import" msgstr "请选择要导入的数据库" #: src/Gui/Import.cs:194 msgid "All supported formats" msgstr "" #: src/Gui/Import.cs:198 #, csharp-format msgid ".{0} files" msgstr "" #: src/Gui/Import.cs:209 msgid "Database:" msgstr "数据库:" #: src/Gui/Import.cs:210 msgid "Format:" msgstr "格式:" #: src/Gui/ItemProperties.cs:29 msgid "Item Properties" msgstr "" #: src/Gui/VolumeScanner.cs:116 msgid "Scanning started." msgstr "" #: src/Gui/VolumeScanner.cs:118 #, csharp-format msgid "Scanning of drive '{0}' started." msgstr "" #: src/Gui/VolumeScanner.cs:124 #, csharp-format msgid "" "Options: generate thumbs: {0}, extract metadata: {1}, discard symlinks: {2}, " "hashing: {3}." msgstr "" #: src/Gui/VolumeScanner.cs:131 #, csharp-format msgid "Options: MusicBrainz enabled: {0}" msgstr "" #: src/Gui/VolumeScanner.cs:157 msgid "Time" msgstr "" #: src/Gui/VolumeScanner.cs:161 msgid "Message" msgstr "" #: src/Gui/VolumeScanner.cs:258 msgid "Stopping Scanner and performing rollback..." msgstr "" #: src/Gui/VolumeScanner.cs:268 msgid "yes" msgstr "是" #: src/Gui/VolumeScanner.cs:268 msgid "no" msgstr "否" #: src/Gui/VolumeScanner.cs:291 msgid "Scan in progress" msgstr "正在扫描" #: src/Gui/VolumeScanner.cs:291 msgid "You must stop scanning before closing this window." msgstr "" #: src/Gui/VolumeScanner.cs:346 #, csharp-format msgid "An unhandled exception occured ({0})." msgstr "" #: src/Gui/VolumeScanner.cs:347 msgid "All database changes have been rolled back." msgstr "" #: src/Gui/VolumeScanner.cs:354 #, csharp-format msgid "Scanning failed. Reason: an unhandled exception occured ({0})." msgstr "" #: src/Gui/VolumeScanner.cs:356 msgid "Scanning aborted." msgstr "扫描已取消。" #: src/Gui/VolumeScanner.cs:358 msgid "Scanning completed successfully." msgstr "" #: src/Gui/VolumeScanner.cs:488 msgid "VolumeScanner" msgstr "" #: src/Gui/VolumeScanner.cs:500 msgid "Volume Information:" msgstr "" #: src/Gui/VolumeScanner.cs:510 msgid "Scanner Log:" msgstr "" #: src/Gui/VolumeScanner.cs:527 msgid "Database access" msgstr "" #: src/Gui/Preferences.cs:119 msgid "None" msgstr "" #: src/Gui/Preferences.cs:228 msgid "Unsupported theme" msgstr "" #: src/Gui/Preferences.cs:229 msgid "The selected icon theme is currently not supported on your system." msgstr "" #: src/Gui/Preferences.cs:267 msgid "Restart required" msgstr "需要重新启动" #: src/Gui/Preferences.cs:268 #, csharp-format msgid "You must restart {0} for icontheme changes to take effect." msgstr "" #: src/Gui/Preferences.cs:298 msgid "Preferences" msgstr "首选项" #: src/Gui/Preferences.cs:322 msgid "_Load Defaults" msgstr "加载默认值(_L)" #: src/Gui/Preferences.cs:349 msgid "Icon theme:" msgstr "图标主题:" #: src/Gui/Preferences.cs:355 msgid "Reopen most recent database on startup" msgstr "启动时打开最近的数据库" #: src/Gui/Preferences.cs:359 msgid "Show iteminfo panel" msgstr "" #: src/Gui/Preferences.cs:363 msgid "Show hidden files" msgstr "" #: src/Gui/Preferences.cs:367 msgid "Show thumbnails in the filebrowser" msgstr "" #: src/Gui/Preferences.cs:370 msgid "General" msgstr "" #: src/Gui/Preferences.cs:378 msgid "Don't prompt, always scan:" msgstr "不要提示,总是扫描:" #: src/Gui/Preferences.cs:397 msgid "Generate Thumbnails" msgstr "生成缩略图" #: src/Gui/Preferences.cs:401 msgid "Extract metadata" msgstr "提取元数据" #: src/Gui/Preferences.cs:405 msgid "Discard symbolic links" msgstr "" #: src/Gui/Preferences.cs:409 msgid "Compute hashcodes for files (slow!)" msgstr "" #: src/Gui/Preferences.cs:413 msgid "Fetch audio cd metadata from MusicBrainz.org" msgstr "" #: src/Gui/Preferences.cs:416 msgid "Scanner" msgstr "" Basenji/po/bg.po0000664000175000017500000005156412067326706013701 0ustar patrickpatrick# Bulgarian translation for basenji # Copyright (c) 2010 Rosetta Contributors and Canonical Ltd 2010 # This file is distributed under the same license as the basenji package. # FIRST AUTHOR , 2010. # msgid "" msgstr "" "Project-Id-Version: basenji\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2012-07-15 15:49+0200\n" "PO-Revision-Date: 2010-04-25 11:22+0000\n" "Last-Translator: svilborg \n" "Language-Team: Bulgarian \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2012-10-27 11:00+0000\n" "X-Generator: Launchpad (build 16194)\n" #: src/Util.cs:30 #, csharp-format msgid "{0} Bytes" msgstr "{0} Байта" #: src/Util.cs:32 msgid "Bytes" msgstr "Байта" #: src/Util.cs:32 msgid "KB" msgstr "КБ" #: src/Util.cs:32 msgid "MB" msgstr "МБ" #: src/Util.cs:32 msgid "GB" msgstr "ГБ" #: src/Util.cs:32 msgid "TB" msgstr "ТБ" #: src/Options.cs:477 msgid "OptionName" msgstr "" #: src/FileDialog.cs:51 msgid "VolumeDatabase files" msgstr "" #: src/FileDialog.cs:56 msgid "All files" msgstr "Всички файлове" #: src/Main.cs:142 src/Gui/MainWindow.cs:76 src/Gui/MainWindow.cs:92 #: src/Gui/MainWindow.cs:334 src/Gui/MainWindow.cs:355 #: src/Gui/MainWindow.cs:377 src/Gui/MainWindow.cs:386 #: src/Gui/MainWindow.cs:635 msgid "Error" msgstr "Грешка" #: src/Main.cs:142 #, csharp-format msgid "{0} is already running." msgstr "" #: src/Gui/Widgets/VolumeView.cs:42 src/Gui/Widgets/SearchResultView.cs:30 msgid "Unnamed" msgstr "Без име" #: src/Gui/Widgets/VolumeView.cs:43 #: src/Gui/Widgets/Editors/VolumeEditor.cs:259 msgid "Category:" msgstr "Категория:" #: src/Gui/Widgets/VolumeView.cs:44 msgid "files" msgstr "файла" #: src/Gui/Widgets/VolumeView.cs:45 msgid "tracks" msgstr "записи" #: src/Gui/Widgets/ItemView.cs:29 msgid "Loading..." msgstr "Зареждане…" #: src/Gui/Widgets/ItemView.cs:30 msgid "(empty)" msgstr "(празно)" #: src/Gui/Widgets/ItemView.cs:99 src/Gui/DriveSelection.cs:80 msgid "Unknown" msgstr "Неизвестно" #: src/Gui/Widgets/ItemView.cs:170 src/Gui/Widgets/Editors/ItemEditor.cs:96 msgid "Name" msgstr "Име" #: src/Gui/Widgets/ItemView.cs:176 msgid "Artist" msgstr "Изпълнител" #: src/Gui/Widgets/ItemView.cs:181 #: src/Gui/Widgets/Editors/AudioTrackItemEditor.cs:53 #: src/Gui/Widgets/ItemInfo.cs:225 src/Gui/Widgets/ItemInfo.cs:288 msgid "Duration" msgstr "Продължителност" #: src/Gui/Widgets/Editors/FileSystemVolumeEditor.cs:34 #: src/Gui/DriveSelection.cs:168 msgid "Filesystem" msgstr "Файлова система" #: src/Gui/Widgets/Editors/FileSystemVolumeEditor.cs:65 msgid "Files:" msgstr "Файлове:" #: src/Gui/Widgets/Editors/FileSystemVolumeEditor.cs:66 msgid "Directories:" msgstr "Папки:" #: src/Gui/Widgets/Editors/FileSystemVolumeEditor.cs:67 msgid "Total size:" msgstr "Общ размер:" #: src/Gui/Widgets/Editors/ItemEditor.cs:95 msgid "Item type" msgstr "" #: src/Gui/Widgets/Editors/ItemEditor.cs:111 src/Gui/Widgets/ItemInfo.cs:371 msgid "Note" msgstr "" #: src/Gui/Widgets/Editors/ItemEditor.cs:112 src/Gui/Widgets/ItemInfo.cs:374 msgid "Keywords" msgstr "" #: src/Gui/Widgets/Editors/AudioTrackItemEditor.cs:31 #: src/Gui/Widgets/SearchResultView.cs:34 msgid "Audio CD track" msgstr "" #: src/Gui/Widgets/Editors/AudioTrackItemEditor.cs:54 #: src/Gui/Widgets/ItemInfo.cs:230 msgid "Type" msgstr "Тип" #: src/Gui/Widgets/Editors/DirectoryItemEditor.cs:28 msgid "Directory" msgstr "" #: src/Gui/Widgets/Editors/FileSystemItemEditor.cs:59 #: src/Gui/Widgets/SearchResultView.cs:31 src/Gui/Widgets/ItemInfo.cs:183 msgid "Location" msgstr "Местоположение" #: src/Gui/Widgets/Editors/FileSystemItemEditor.cs:60 #: src/Gui/Widgets/ItemInfo.cs:185 msgid "Last write time" msgstr "Време на последен запис" #: src/Gui/Widgets/Editors/FileSystemItemEditor.cs:61 #: src/Gui/Widgets/ItemInfo.cs:210 msgid "Filetype" msgstr "Тип файл" #: src/Gui/Widgets/Editors/FileItemEditor.cs:31 msgid "File" msgstr "" #: src/Gui/Widgets/Editors/FileItemEditor.cs:52 #: src/Gui/Widgets/ItemInfo.cs:204 src/Gui/Widgets/ItemInfo.cs:226 #: src/Gui/DriveSelection.cs:148 msgid "Size" msgstr "Размер" #: src/Gui/Widgets/Editors/FileItemEditor.cs:53 #: src/Gui/Widgets/ItemInfo.cs:206 msgid "Hash" msgstr "" #: src/Gui/Widgets/Editors/AudioCdVolumeEditor.cs:33 msgid "Audio CD" msgstr "" #: src/Gui/Widgets/Editors/AudioCdVolumeEditor.cs:63 msgid "Tracks:" msgstr "Песни:" #: src/Gui/Widgets/Editors/AudioCdVolumeEditor.cs:64 msgid "Duration:" msgstr "Продължителност:" #: src/Gui/Widgets/Editors/VolumeEditor.cs:45 msgid "Backup" msgstr "Архивиране" #: src/Gui/Widgets/Editors/VolumeEditor.cs:46 #: src/Gui/Widgets/CategoryView.cs:60 msgid "Documents" msgstr "Документи" #: src/Gui/Widgets/Editors/VolumeEditor.cs:47 #: src/Gui/Widgets/CategoryView.cs:61 msgid "Music" msgstr "Музика" #: src/Gui/Widgets/Editors/VolumeEditor.cs:48 msgid "Audiobooks" msgstr "" #: src/Gui/Widgets/Editors/VolumeEditor.cs:49 #: src/Gui/Widgets/CategoryView.cs:62 msgid "Movies" msgstr "Филми" #: src/Gui/Widgets/Editors/VolumeEditor.cs:50 msgid "Videos" msgstr "" #: src/Gui/Widgets/Editors/VolumeEditor.cs:51 msgid "Pictures" msgstr "Илюстрации" #: src/Gui/Widgets/Editors/VolumeEditor.cs:52 msgid "Games" msgstr "" #: src/Gui/Widgets/Editors/VolumeEditor.cs:53 src/Gui/Widgets/ItemInfo.cs:319 msgid "Software" msgstr "Софтуер" #: src/Gui/Widgets/Editors/VolumeEditor.cs:54 msgid "Misc" msgstr "Разни" #: src/Gui/Widgets/Editors/VolumeEditor.cs:55 msgid "Other" msgstr "Други" #: src/Gui/Widgets/Editors/VolumeEditor.cs:225 msgid "Yes" msgstr "Да" #: src/Gui/Widgets/Editors/VolumeEditor.cs:225 msgid "No" msgstr "Не" #: src/Gui/Widgets/Editors/VolumeEditor.cs:235 msgid "Volume type:" msgstr "" #: src/Gui/Widgets/Editors/VolumeEditor.cs:236 msgid "Hashed:" msgstr "" #: src/Gui/Widgets/Editors/VolumeEditor.cs:237 msgid "Added:" msgstr "Добавено:" #: src/Gui/Widgets/Editors/VolumeEditor.cs:258 msgid "Archive No.:" msgstr "Номер на архив:" #: src/Gui/Widgets/Editors/VolumeEditor.cs:260 msgid "Title:" msgstr "Заглавие:" #: src/Gui/Widgets/Editors/VolumeEditor.cs:261 src/Gui/DBProperties.cs:98 msgid "Description:" msgstr "Описание:" #: src/Gui/Widgets/Editors/VolumeEditor.cs:262 msgid "Keywords:" msgstr "Ключови думи:" #: src/Gui/Widgets/Editors/VolumeEditor.cs:263 msgid "Loaned to:" msgstr "Заето от:" #: src/Gui/Widgets/Editors/VolumeEditor.cs:264 msgid "Loaned date:" msgstr "Дата на заемане:" #: src/Gui/Widgets/Editors/VolumeEditor.cs:265 msgid "Return date:" msgstr "Дата на връщане:" #: src/Gui/Widgets/CategoryView.cs:58 msgid "Directories" msgstr "Папки" #: src/Gui/Widgets/CategoryView.cs:59 msgid "Text" msgstr "Текст" #: src/Gui/Widgets/CategoryView.cs:63 msgid "Images" msgstr "Изображения" #: src/Gui/Widgets/CategoryView.cs:64 msgid "Applications" msgstr "Приложения" #: src/Gui/Widgets/CategoryView.cs:65 msgid "Archives" msgstr "Архиви" #: src/Gui/Widgets/CategoryView.cs:66 msgid "Development" msgstr "" #: src/Gui/Widgets/CategoryView.cs:96 src/Gui/MainWindow.cs:1046 msgid "Category" msgstr "Категория" #: src/Gui/Widgets/CategoryView.cs:128 msgid "All items" msgstr "Вички записи" #: src/Gui/Widgets/SearchResultView.cs:32 msgid "Volume" msgstr "" #: src/Gui/Widgets/SearchResultView.cs:33 src/Gui/MainWindow.cs:1040 msgid "Archive No." msgstr "Номер на архив" #: src/Gui/Widgets/ItemInfo.cs:40 msgid "by" msgstr "от" #: src/Gui/Widgets/ItemInfo.cs:41 msgid "from" msgstr "от" #: src/Gui/Widgets/ItemInfo.cs:196 msgid "Symlink target" msgstr "" #: src/Gui/Widgets/ItemInfo.cs:227 msgid "Track No." msgstr "Номер на песен" #: src/Gui/Widgets/ItemInfo.cs:258 msgid "Genre" msgstr "Жанр" #: src/Gui/Widgets/ItemInfo.cs:278 msgid "Year" msgstr "Година" #: src/Gui/Widgets/ItemInfo.cs:283 msgid "Description" msgstr "Описание" #: src/Gui/Widgets/ItemInfo.cs:294 msgid "Dimensions" msgstr "Размери" #: src/Gui/Widgets/ItemInfo.cs:299 msgid "Format" msgstr "Формат" #: src/Gui/Widgets/ItemInfo.cs:303 msgid "Author" msgstr "Автор" #: src/Gui/Widgets/ItemInfo.cs:307 msgid "Copyright" msgstr "Авторски права" #: src/Gui/Widgets/ItemInfo.cs:311 msgid "Producer" msgstr "Продуцент" #: src/Gui/Widgets/ItemInfo.cs:315 msgid "Creator" msgstr "" #: src/Gui/Widgets/ItemInfo.cs:323 msgid "Language" msgstr "Език" #: src/Gui/Widgets/ItemInfo.cs:327 msgid "Page count" msgstr "Брой страници" #: src/Gui/Widgets/ItemInfo.cs:346 msgid "File count" msgstr "Брой файлове" #: src/Gui/Widgets/PageNavigation.cs:27 msgid "No items." msgstr "Няма записи." #: src/Gui/Widgets/PageNavigation.cs:145 #, csharp-format msgid "Page {0}/{1} ({2} - {3} of {4} items)" msgstr "Страница {0}/{1} ({2} - {3} от {4} записа)" #: src/Gui/ObjectProperties.cs:54 src/Gui/VolumeScanner.cs:248 msgid "Invalid data" msgstr "Невалидни данни" #: src/Gui/ObjectProperties.cs:54 src/Gui/VolumeScanner.cs:249 #, csharp-format msgid "" "\"{0}\" is {1}.\n" "\n" "Expected format: {2}\n" "Please correct or remove the data you entered." msgstr "" #: src/Gui/DBProperties.cs:85 msgid "Database Properties" msgstr "Настойки на базата данни" #: src/Gui/DBProperties.cs:97 msgid "Name:" msgstr "Име:" #: src/Gui/DBProperties.cs:99 msgid "Created:" msgstr "Създаден на:" #: src/Gui/VolumeProperties.cs:29 msgid "Volume Properties" msgstr "" #: src/Gui/DriveSelection.cs:60 msgid "Waiting for drives..." msgstr "" #: src/Gui/DriveSelection.cs:133 msgid "Drive" msgstr "Устройство" #: src/Gui/DriveSelection.cs:139 msgid "Label" msgstr "Етикет" #: src/Gui/DriveSelection.cs:241 msgid "Please select a drive to scan" msgstr "" #: src/Gui/About.cs:28 msgid "A cross-platform media indexing/search tool." msgstr "" #: src/Gui/About.cs:29 #, csharp-format msgid "Using VolumeDB v{0}." msgstr "Използва се VolumeDB v{0}." #: src/Gui/About.cs:31 msgid "Copyright (c) " msgstr "Авторско право " #: src/Gui/ItemSearch.cs:81 #, csharp-format msgid "Found {0} items in {1:F3} seconds." msgstr "Намерени са {0} записа за {1:F3} секунди." #: src/Gui/ItemSearch.cs:92 src/Gui/MainWindow.cs:519 msgid "Timeout: another search is probably still in progress." msgstr "" #: src/Gui/ItemSearch.cs:94 msgid "Too many search results. Please refine your search criteria." msgstr "Твърде много резултати от търсенето. Моля, уточнете Вашето търсене." #: src/Gui/ItemSearch.cs:112 src/Gui/MainWindow.cs:535 msgid "Searching..." msgstr "Търсене..." #: src/Gui/ItemSearch.cs:267 msgid "Search Items" msgstr "" #: src/Gui/ItemSearch.cs:279 src/Gui/MainWindow.cs:1145 msgid "default" msgstr "" #: src/Gui/ItemSearch.cs:283 msgid "Search items" msgstr "" #: src/Gui/ItemSearch.cs:318 msgid "Quick tip:" msgstr "" #: src/Gui/ItemSearch.cs:319 #, csharp-format msgid "" "Click on the icon to the left of the search field to build advanced search " "queries.\n" "Example: {0}" msgstr "" #: src/Gui/ItemSearch.cs:326 msgid "No search results." msgstr "Няма резултати от търсенето." #: src/Gui/ItemSearch.cs:375 src/Gui/MainWindow.cs:1028 msgid "Edit Item" msgstr "" #: src/Gui/ItemSearch.cs:382 msgid "Show in Main Window" msgstr "" #: src/Gui/MainWindow.cs:77 src/Gui/MainWindow.cs:93 src/Gui/MainWindow.cs:635 #, csharp-format msgid "Database '{0}' not found." msgstr "База данни '{0}' не е открита." #: src/Gui/MainWindow.cs:185 msgid "Database not found" msgstr "Базата данни не е открита." #: src/Gui/MainWindow.cs:186 msgid "Default database not found. Create?" msgstr "Базата данни по подразбиране не е открита. Да бъде ли създадена ?" #: src/Gui/MainWindow.cs:215 msgid "Unsupported database version" msgstr "" #: src/Gui/MainWindow.cs:216 msgid "This database version is not supported." msgstr "" #: src/Gui/MainWindow.cs:235 #, csharp-format msgid "{0} volumes loaded." msgstr "{0} заредени устройства." #: src/Gui/MainWindow.cs:256 #, csharp-format msgid "An error occured while loading the volume list: {0}" msgstr "Грешка при зареждане на списъка с устройства : {0}" #: src/Gui/MainWindow.cs:300 msgid "Please enter the name for the new database" msgstr "Моля, въведете име на новата база данни" #: src/Gui/MainWindow.cs:312 msgid "Database exists" msgstr "Базата данни съществува." #: src/Gui/MainWindow.cs:313 msgid "Database already exists. Overwrite?" msgstr "" #: src/Gui/MainWindow.cs:326 msgid "Please select a database" msgstr "Моля, изберете база данни" #: src/Gui/MainWindow.cs:335 src/Gui/Import.cs:83 msgid "Database not found." msgstr "Базата данни не е намерена." #: src/Gui/MainWindow.cs:356 #, csharp-format msgid "" "An error occured while accessing drive {0}:\n" "{1}" msgstr "" #: src/Gui/MainWindow.cs:378 #, csharp-format msgid "Drive {0} is not ready." msgstr "" #: src/Gui/MainWindow.cs:387 #, csharp-format msgid "Drive {0} is neither mounted nor does it contain an audio cd." msgstr "" #: src/Gui/MainWindow.cs:406 msgid "Confirmation" msgstr "Потвърждение" #: src/Gui/MainWindow.cs:407 msgid "Are you sure you really want to remove the selected volume?" msgstr "" #: src/Gui/MainWindow.cs:712 #, csharp-format msgid "Please insert volume '{0}'." msgstr "" #: src/Gui/MainWindow.cs:714 msgid "Waiting for volume" msgstr "" #: src/Gui/MainWindow.cs:966 msgid "Add Volume" msgstr "" #: src/Gui/MainWindow.cs:970 msgid "Search" msgstr "" #: src/Gui/MainWindow.cs:973 msgid "App Menu" msgstr "" #: src/Gui/MainWindow.cs:979 msgid "_New Database" msgstr "" #: src/Gui/MainWindow.cs:982 msgid "_Open Database" msgstr "" #: src/Gui/MainWindow.cs:985 msgid "Open Default Database" msgstr "" #: src/Gui/MainWindow.cs:991 msgid "Recent Databases" msgstr "" #: src/Gui/MainWindow.cs:998 msgid "_Import" msgstr "_Импортиране" #: src/Gui/MainWindow.cs:1001 msgid "_Preferences" msgstr "_Предпочитания" #: src/Gui/MainWindow.cs:1004 msgid "_Database Properties" msgstr "" #: src/Gui/MainWindow.cs:1007 msgid "Info" msgstr "" #: src/Gui/MainWindow.cs:1010 msgid "_Quit" msgstr "_Затваряне" #: src/Gui/MainWindow.cs:1016 msgid "_Edit Volume" msgstr "" #: src/Gui/MainWindow.cs:1019 msgid "_Remove Volume" msgstr "" #: src/Gui/MainWindow.cs:1022 msgid "Rescan Volume" msgstr "" #: src/Gui/MainWindow.cs:1034 msgid "Sort by" msgstr "" #: src/Gui/MainWindow.cs:1037 msgid "Descending" msgstr "" #: src/Gui/MainWindow.cs:1043 msgid "Date added" msgstr "" #: src/Gui/MainWindow.cs:1044 msgid "Title" msgstr "" #: src/Gui/MainWindow.cs:1045 msgid "Drivetype" msgstr "" #: src/Gui/MainWindow.cs:1142 msgid "Filter volumes" msgstr "" #: src/Gui/Import.cs:29 msgid "Import" msgstr "Импортиране" #: src/Gui/Import.cs:30 msgid "Abort" msgstr "Прекъсване" #: src/Gui/Import.cs:31 msgid "Please select a database." msgstr "" #: src/Gui/Import.cs:72 #, csharp-format msgid "{0:0}% completed." msgstr "" #: src/Gui/Import.cs:82 msgid "Import failed" msgstr "Импортирането е неуспешно" #: src/Gui/Import.cs:85 msgid "Import failed!" msgstr "Импортирането е неуспешно!" #: src/Gui/Import.cs:87 msgid "Import aborted." msgstr "Импортирането е прекъснато." #: src/Gui/Import.cs:89 msgid "Import completed successfully." msgstr "Импортирането е успешно завършено." #: src/Gui/Import.cs:121 msgid "Import in progress" msgstr "В Процес на импортиране" #: src/Gui/Import.cs:122 msgid "You must stop the import before closing this window." msgstr "Трябва да спрете импортирането за да затворите прозореца." #: src/Gui/Import.cs:148 msgid "Unknown format." msgstr "" #: src/Gui/Import.cs:175 msgid "Import Database" msgstr "Импортиране на базата данни" #: src/Gui/Import.cs:186 msgid "Please select a database to import" msgstr "Моля изберете база данни за импортиране" #: src/Gui/Import.cs:194 msgid "All supported formats" msgstr "" #: src/Gui/Import.cs:198 #, csharp-format msgid ".{0} files" msgstr "" #: src/Gui/Import.cs:209 msgid "Database:" msgstr "База данни:" #: src/Gui/Import.cs:210 msgid "Format:" msgstr "Формат:" #: src/Gui/ItemProperties.cs:29 msgid "Item Properties" msgstr "" #: src/Gui/VolumeScanner.cs:116 msgid "Scanning started." msgstr "Сканирането е стартирано." #: src/Gui/VolumeScanner.cs:118 #, csharp-format msgid "Scanning of drive '{0}' started." msgstr "Сканиране на диск '{0}'." #: src/Gui/VolumeScanner.cs:124 #, csharp-format msgid "" "Options: generate thumbs: {0}, extract metadata: {1}, discard symlinks: {2}, " "hashing: {3}." msgstr "" #: src/Gui/VolumeScanner.cs:131 #, csharp-format msgid "Options: MusicBrainz enabled: {0}" msgstr "" #: src/Gui/VolumeScanner.cs:157 msgid "Time" msgstr "Време" #: src/Gui/VolumeScanner.cs:161 msgid "Message" msgstr "Съобщение" #: src/Gui/VolumeScanner.cs:258 msgid "Stopping Scanner and performing rollback..." msgstr "" #: src/Gui/VolumeScanner.cs:268 msgid "yes" msgstr "да" #: src/Gui/VolumeScanner.cs:268 msgid "no" msgstr "не" #: src/Gui/VolumeScanner.cs:291 msgid "Scan in progress" msgstr "В процес на сканиране." #: src/Gui/VolumeScanner.cs:291 msgid "You must stop scanning before closing this window." msgstr "Трябва да прекратите сканирането, за да затворите прозореца." #: src/Gui/VolumeScanner.cs:346 #, csharp-format msgid "An unhandled exception occured ({0})." msgstr "Необработено изключение ({0})." #: src/Gui/VolumeScanner.cs:347 msgid "All database changes have been rolled back." msgstr "Всички промени в базата данни са отменени." #: src/Gui/VolumeScanner.cs:354 #, csharp-format msgid "Scanning failed. Reason: an unhandled exception occured ({0})." msgstr "Грешка при сканиране. Причина: необработено изключение ({0})." #: src/Gui/VolumeScanner.cs:356 msgid "Scanning aborted." msgstr "Сканирането е прекратено." #: src/Gui/VolumeScanner.cs:358 msgid "Scanning completed successfully." msgstr "Сканирането е успешно завършено." #: src/Gui/VolumeScanner.cs:488 msgid "VolumeScanner" msgstr "Скенер на устройства" #: src/Gui/VolumeScanner.cs:500 msgid "Volume Information:" msgstr "Информация за устройство:" #: src/Gui/VolumeScanner.cs:510 msgid "Scanner Log:" msgstr "Дневник на сканиране:" #: src/Gui/VolumeScanner.cs:527 msgid "Database access" msgstr "Достъп до база данни" #: src/Gui/Preferences.cs:119 msgid "None" msgstr "" #: src/Gui/Preferences.cs:228 msgid "Unsupported theme" msgstr "" #: src/Gui/Preferences.cs:229 msgid "The selected icon theme is currently not supported on your system." msgstr "" #: src/Gui/Preferences.cs:267 msgid "Restart required" msgstr "Изисква се рестартиране" #: src/Gui/Preferences.cs:268 #, csharp-format msgid "You must restart {0} for icontheme changes to take effect." msgstr "" #: src/Gui/Preferences.cs:298 msgid "Preferences" msgstr "Предпочитания" #: src/Gui/Preferences.cs:322 msgid "_Load Defaults" msgstr "" #: src/Gui/Preferences.cs:349 msgid "Icon theme:" msgstr "" #: src/Gui/Preferences.cs:355 msgid "Reopen most recent database on startup" msgstr "" #: src/Gui/Preferences.cs:359 msgid "Show iteminfo panel" msgstr "" #: src/Gui/Preferences.cs:363 msgid "Show hidden files" msgstr "" #: src/Gui/Preferences.cs:367 msgid "Show thumbnails in the filebrowser" msgstr "" #: src/Gui/Preferences.cs:370 msgid "General" msgstr "Общи" #: src/Gui/Preferences.cs:378 msgid "Don't prompt, always scan:" msgstr "" #: src/Gui/Preferences.cs:397 msgid "Generate Thumbnails" msgstr "" #: src/Gui/Preferences.cs:401 msgid "Extract metadata" msgstr "Извличане на метаданни" #: src/Gui/Preferences.cs:405 msgid "Discard symbolic links" msgstr "" #: src/Gui/Preferences.cs:409 msgid "Compute hashcodes for files (slow!)" msgstr "" #: src/Gui/Preferences.cs:413 msgid "Fetch audio cd metadata from MusicBrainz.org" msgstr "" #: src/Gui/Preferences.cs:416 msgid "Scanner" msgstr "Скенер" Basenji/po/sk.po0000664000175000017500000005306212067326706013721 0ustar patrickpatrick# Slovak translation for basenji # Copyright (c) 2012 Rosetta Contributors and Canonical Ltd 2012 # This file is distributed under the same license as the basenji package. # FIRST AUTHOR , 2012. # msgid "" msgstr "" "Project-Id-Version: basenji\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2012-07-15 15:49+0200\n" "PO-Revision-Date: 2012-07-23 14:01+0000\n" "Last-Translator: Izidor Matušov \n" "Language-Team: Slovak \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2012-10-27 11:00+0000\n" "X-Generator: Launchpad (build 16194)\n" #: src/Util.cs:30 #, csharp-format msgid "{0} Bytes" msgstr "{0} bajtov" #: src/Util.cs:32 msgid "Bytes" msgstr "bajtov" #: src/Util.cs:32 msgid "KB" msgstr "kB" #: src/Util.cs:32 msgid "MB" msgstr "MB" #: src/Util.cs:32 msgid "GB" msgstr "GB" #: src/Util.cs:32 msgid "TB" msgstr "TB" #: src/Options.cs:477 msgid "OptionName" msgstr "MenoMožnosti" #: src/FileDialog.cs:51 msgid "VolumeDatabase files" msgstr "Súbory VolumeDatabase" #: src/FileDialog.cs:56 msgid "All files" msgstr "Všetky súbory" #: src/Main.cs:142 src/Gui/MainWindow.cs:76 src/Gui/MainWindow.cs:92 #: src/Gui/MainWindow.cs:334 src/Gui/MainWindow.cs:355 #: src/Gui/MainWindow.cs:377 src/Gui/MainWindow.cs:386 #: src/Gui/MainWindow.cs:635 msgid "Error" msgstr "Chyba" #: src/Main.cs:142 #, csharp-format msgid "{0} is already running." msgstr "{0} je už spustené." #: src/Gui/Widgets/VolumeView.cs:42 src/Gui/Widgets/SearchResultView.cs:30 msgid "Unnamed" msgstr "Bez názvu" #: src/Gui/Widgets/VolumeView.cs:43 #: src/Gui/Widgets/Editors/VolumeEditor.cs:259 msgid "Category:" msgstr "Kategória" #: src/Gui/Widgets/VolumeView.cs:44 msgid "files" msgstr "súbory" #: src/Gui/Widgets/VolumeView.cs:45 msgid "tracks" msgstr "skladby" #: src/Gui/Widgets/ItemView.cs:29 msgid "Loading..." msgstr "Nahrávam..." #: src/Gui/Widgets/ItemView.cs:30 msgid "(empty)" msgstr "(prázdne)" #: src/Gui/Widgets/ItemView.cs:99 src/Gui/DriveSelection.cs:80 msgid "Unknown" msgstr "Neznámy" #: src/Gui/Widgets/ItemView.cs:170 src/Gui/Widgets/Editors/ItemEditor.cs:96 msgid "Name" msgstr "Názov" #: src/Gui/Widgets/ItemView.cs:176 msgid "Artist" msgstr "Interprét" #: src/Gui/Widgets/ItemView.cs:181 #: src/Gui/Widgets/Editors/AudioTrackItemEditor.cs:53 #: src/Gui/Widgets/ItemInfo.cs:225 src/Gui/Widgets/ItemInfo.cs:288 msgid "Duration" msgstr "Dĺžka" #: src/Gui/Widgets/Editors/FileSystemVolumeEditor.cs:34 #: src/Gui/DriveSelection.cs:168 msgid "Filesystem" msgstr "Súborový systém" #: src/Gui/Widgets/Editors/FileSystemVolumeEditor.cs:65 msgid "Files:" msgstr "Súbory" #: src/Gui/Widgets/Editors/FileSystemVolumeEditor.cs:66 msgid "Directories:" msgstr "Adresáre:" #: src/Gui/Widgets/Editors/FileSystemVolumeEditor.cs:67 msgid "Total size:" msgstr "Celková veľkosť:" #: src/Gui/Widgets/Editors/ItemEditor.cs:95 msgid "Item type" msgstr "Druh položky" #: src/Gui/Widgets/Editors/ItemEditor.cs:111 src/Gui/Widgets/ItemInfo.cs:371 msgid "Note" msgstr "Poznámka" #: src/Gui/Widgets/Editors/ItemEditor.cs:112 src/Gui/Widgets/ItemInfo.cs:374 msgid "Keywords" msgstr "Kľúčové slová" #: src/Gui/Widgets/Editors/AudioTrackItemEditor.cs:31 #: src/Gui/Widgets/SearchResultView.cs:34 msgid "Audio CD track" msgstr "Skladba na hudobnom CD" #: src/Gui/Widgets/Editors/AudioTrackItemEditor.cs:54 #: src/Gui/Widgets/ItemInfo.cs:230 msgid "Type" msgstr "Typ" #: src/Gui/Widgets/Editors/DirectoryItemEditor.cs:28 msgid "Directory" msgstr "Adresár" #: src/Gui/Widgets/Editors/FileSystemItemEditor.cs:59 #: src/Gui/Widgets/SearchResultView.cs:31 src/Gui/Widgets/ItemInfo.cs:183 msgid "Location" msgstr "Umiestnenie" #: src/Gui/Widgets/Editors/FileSystemItemEditor.cs:60 #: src/Gui/Widgets/ItemInfo.cs:185 msgid "Last write time" msgstr "Čas posledného zápisu" #: src/Gui/Widgets/Editors/FileSystemItemEditor.cs:61 #: src/Gui/Widgets/ItemInfo.cs:210 msgid "Filetype" msgstr "Typ súboru" #: src/Gui/Widgets/Editors/FileItemEditor.cs:31 msgid "File" msgstr "Súbor" #: src/Gui/Widgets/Editors/FileItemEditor.cs:52 #: src/Gui/Widgets/ItemInfo.cs:204 src/Gui/Widgets/ItemInfo.cs:226 #: src/Gui/DriveSelection.cs:148 msgid "Size" msgstr "Veľkosť" #: src/Gui/Widgets/Editors/FileItemEditor.cs:53 #: src/Gui/Widgets/ItemInfo.cs:206 msgid "Hash" msgstr "Hash" #: src/Gui/Widgets/Editors/AudioCdVolumeEditor.cs:33 msgid "Audio CD" msgstr "Zvukové CD" #: src/Gui/Widgets/Editors/AudioCdVolumeEditor.cs:63 msgid "Tracks:" msgstr "Skladby:" #: src/Gui/Widgets/Editors/AudioCdVolumeEditor.cs:64 msgid "Duration:" msgstr "Dĺžka:" #: src/Gui/Widgets/Editors/VolumeEditor.cs:45 msgid "Backup" msgstr "Záloha" #: src/Gui/Widgets/Editors/VolumeEditor.cs:46 #: src/Gui/Widgets/CategoryView.cs:60 msgid "Documents" msgstr "Dokumenty" #: src/Gui/Widgets/Editors/VolumeEditor.cs:47 #: src/Gui/Widgets/CategoryView.cs:61 msgid "Music" msgstr "Hudba" #: src/Gui/Widgets/Editors/VolumeEditor.cs:48 msgid "Audiobooks" msgstr "Audioknihy" #: src/Gui/Widgets/Editors/VolumeEditor.cs:49 #: src/Gui/Widgets/CategoryView.cs:62 msgid "Movies" msgstr "Filmy" #: src/Gui/Widgets/Editors/VolumeEditor.cs:50 msgid "Videos" msgstr "Videá" #: src/Gui/Widgets/Editors/VolumeEditor.cs:51 msgid "Pictures" msgstr "Obrázky" #: src/Gui/Widgets/Editors/VolumeEditor.cs:52 msgid "Games" msgstr "Hry" #: src/Gui/Widgets/Editors/VolumeEditor.cs:53 src/Gui/Widgets/ItemInfo.cs:319 msgid "Software" msgstr "Programy" #: src/Gui/Widgets/Editors/VolumeEditor.cs:54 msgid "Misc" msgstr "Rôzne" #: src/Gui/Widgets/Editors/VolumeEditor.cs:55 msgid "Other" msgstr "Ostatné" #: src/Gui/Widgets/Editors/VolumeEditor.cs:225 msgid "Yes" msgstr "Áno" #: src/Gui/Widgets/Editors/VolumeEditor.cs:225 msgid "No" msgstr "Nie" #: src/Gui/Widgets/Editors/VolumeEditor.cs:235 msgid "Volume type:" msgstr "Typ zväzku" #: src/Gui/Widgets/Editors/VolumeEditor.cs:236 msgid "Hashed:" msgstr "Hash bol vytvorený:" #: src/Gui/Widgets/Editors/VolumeEditor.cs:237 msgid "Added:" msgstr "Pridané" #: src/Gui/Widgets/Editors/VolumeEditor.cs:258 msgid "Archive No.:" msgstr "Číslo archívu:" #: src/Gui/Widgets/Editors/VolumeEditor.cs:260 msgid "Title:" msgstr "Názov" #: src/Gui/Widgets/Editors/VolumeEditor.cs:261 src/Gui/DBProperties.cs:98 msgid "Description:" msgstr "Popis:" #: src/Gui/Widgets/Editors/VolumeEditor.cs:262 msgid "Keywords:" msgstr "Kľúčové slová:" #: src/Gui/Widgets/Editors/VolumeEditor.cs:263 msgid "Loaned to:" msgstr "Požičané:" #: src/Gui/Widgets/Editors/VolumeEditor.cs:264 msgid "Loaned date:" msgstr "Dátum pôžičky:" #: src/Gui/Widgets/Editors/VolumeEditor.cs:265 msgid "Return date:" msgstr "Vrátene:" #: src/Gui/Widgets/CategoryView.cs:58 msgid "Directories" msgstr "Adresáre" #: src/Gui/Widgets/CategoryView.cs:59 msgid "Text" msgstr "Text" #: src/Gui/Widgets/CategoryView.cs:63 msgid "Images" msgstr "Obrázky" #: src/Gui/Widgets/CategoryView.cs:64 msgid "Applications" msgstr "Aplikácie" #: src/Gui/Widgets/CategoryView.cs:65 msgid "Archives" msgstr "Archívy" #: src/Gui/Widgets/CategoryView.cs:66 msgid "Development" msgstr "Vývojové nástroje" #: src/Gui/Widgets/CategoryView.cs:96 src/Gui/MainWindow.cs:1046 msgid "Category" msgstr "Kategória" #: src/Gui/Widgets/CategoryView.cs:128 msgid "All items" msgstr "Všetky položky" #: src/Gui/Widgets/SearchResultView.cs:32 msgid "Volume" msgstr "Disk" #: src/Gui/Widgets/SearchResultView.cs:33 src/Gui/MainWindow.cs:1040 msgid "Archive No." msgstr "Číslo archívu" #: src/Gui/Widgets/ItemInfo.cs:40 msgid "by" msgstr "od" #: src/Gui/Widgets/ItemInfo.cs:41 msgid "from" msgstr "z" #: src/Gui/Widgets/ItemInfo.cs:196 msgid "Symlink target" msgstr "Symlink odkaz" #: src/Gui/Widgets/ItemInfo.cs:227 msgid "Track No." msgstr "Číslo skladby" #: src/Gui/Widgets/ItemInfo.cs:258 msgid "Genre" msgstr "Žáner" #: src/Gui/Widgets/ItemInfo.cs:278 msgid "Year" msgstr "Rok" #: src/Gui/Widgets/ItemInfo.cs:283 msgid "Description" msgstr "Popis" #: src/Gui/Widgets/ItemInfo.cs:294 msgid "Dimensions" msgstr "Veľkosti" #: src/Gui/Widgets/ItemInfo.cs:299 msgid "Format" msgstr "Formát" #: src/Gui/Widgets/ItemInfo.cs:303 msgid "Author" msgstr "Autor" #: src/Gui/Widgets/ItemInfo.cs:307 msgid "Copyright" msgstr "Autorské práva" #: src/Gui/Widgets/ItemInfo.cs:311 msgid "Producer" msgstr "Producent" #: src/Gui/Widgets/ItemInfo.cs:315 msgid "Creator" msgstr "Tvorca" #: src/Gui/Widgets/ItemInfo.cs:323 msgid "Language" msgstr "Jazyk" #: src/Gui/Widgets/ItemInfo.cs:327 msgid "Page count" msgstr "Počet strán" #: src/Gui/Widgets/ItemInfo.cs:346 msgid "File count" msgstr "Počet súborov" #: src/Gui/Widgets/PageNavigation.cs:27 msgid "No items." msgstr "Žiadne položky." #: src/Gui/Widgets/PageNavigation.cs:145 #, csharp-format msgid "Page {0}/{1} ({2} - {3} of {4} items)" msgstr "Strana {0}/{1} ({2} - {3} zo {4} položiek)" #: src/Gui/ObjectProperties.cs:54 src/Gui/VolumeScanner.cs:248 msgid "Invalid data" msgstr "Nesprávne údaje" #: src/Gui/ObjectProperties.cs:54 src/Gui/VolumeScanner.cs:249 #, csharp-format msgid "" "\"{0}\" is {1}.\n" "\n" "Expected format: {2}\n" "Please correct or remove the data you entered." msgstr "" "\"{0}\" je {1}\n" "\n" "Očakávaný formát: {2}\n" "Prosím, opravte alebo odstráňte údaje v nesprávnom formáte." #: src/Gui/DBProperties.cs:85 msgid "Database Properties" msgstr "Vlastnosti databáze" #: src/Gui/DBProperties.cs:97 msgid "Name:" msgstr "Názov:" #: src/Gui/DBProperties.cs:99 msgid "Created:" msgstr "Vytvorené:" #: src/Gui/VolumeProperties.cs:29 msgid "Volume Properties" msgstr "Vlastnosti disku" #: src/Gui/DriveSelection.cs:60 msgid "Waiting for drives..." msgstr "Čakám na ovládače..." #: src/Gui/DriveSelection.cs:133 msgid "Drive" msgstr "Jednotka" #: src/Gui/DriveSelection.cs:139 msgid "Label" msgstr "Označenie" #: src/Gui/DriveSelection.cs:241 msgid "Please select a drive to scan" msgstr "Vyberte jednotku, ktorá sa má prehľadať" #: src/Gui/About.cs:28 msgid "A cross-platform media indexing/search tool." msgstr "" "Multiplatformný nástroj na indexovanie a vyhľadávanie medialných súborov." #: src/Gui/About.cs:29 #, csharp-format msgid "Using VolumeDB v{0}." msgstr "Používa VolumeDB v{0}" #: src/Gui/About.cs:31 msgid "Copyright (c) " msgstr "Copyright (c) " #: src/Gui/ItemSearch.cs:81 #, csharp-format msgid "Found {0} items in {1:F3} seconds." msgstr "Najdených {0} položiek za {1:F3} sekúnd." #: src/Gui/ItemSearch.cs:92 src/Gui/MainWindow.cs:519 msgid "Timeout: another search is probably still in progress." msgstr "" "Vypršal časový limit: pravdepodobne prebieha stále prebieha iné vyhľadávanie." #: src/Gui/ItemSearch.cs:94 msgid "Too many search results. Please refine your search criteria." msgstr "" "Príliš veľa výsledkov vyhľadávania. Prosím sprísnite kritériá vyhľadávania." #: src/Gui/ItemSearch.cs:112 src/Gui/MainWindow.cs:535 msgid "Searching..." msgstr "Hľadám..." #: src/Gui/ItemSearch.cs:267 msgid "Search Items" msgstr "Nájdené položky" #: src/Gui/ItemSearch.cs:279 src/Gui/MainWindow.cs:1145 msgid "default" msgstr "štandardný" #: src/Gui/ItemSearch.cs:283 msgid "Search items" msgstr "Hľadané položky" #: src/Gui/ItemSearch.cs:318 msgid "Quick tip:" msgstr "Tip:" #: src/Gui/ItemSearch.cs:319 #, csharp-format msgid "" "Click on the icon to the left of the search field to build advanced search " "queries.\n" "Example: {0}" msgstr "" "Pre vytváranie zložitejších kritérií vyhľadávania kliknite na ikona vľavo od " "vyhľadávacieho políčka.\n" "Napríklad: {0}" #: src/Gui/ItemSearch.cs:326 msgid "No search results." msgstr "Nenašli sa žiadne položky." #: src/Gui/ItemSearch.cs:375 src/Gui/MainWindow.cs:1028 msgid "Edit Item" msgstr "Upraviť položku" #: src/Gui/ItemSearch.cs:382 msgid "Show in Main Window" msgstr "Zobraziť v hlavnom okne" #: src/Gui/MainWindow.cs:77 src/Gui/MainWindow.cs:93 src/Gui/MainWindow.cs:635 #, csharp-format msgid "Database '{0}' not found." msgstr "Databáza '{0}' sa nenašla." #: src/Gui/MainWindow.cs:185 msgid "Database not found" msgstr "Databáza sa nenašla." #: src/Gui/MainWindow.cs:186 msgid "Default database not found. Create?" msgstr "Nenašla sa predvolená databáza. Chcete ju vytvoriť?" #: src/Gui/MainWindow.cs:215 msgid "Unsupported database version" msgstr "Nepodporovaná verzia databáze" #: src/Gui/MainWindow.cs:216 msgid "This database version is not supported." msgstr "Táto verzia databáze nie je podporovaná." #: src/Gui/MainWindow.cs:235 #, csharp-format msgid "{0} volumes loaded." msgstr "Načítaných {0} diskov." #: src/Gui/MainWindow.cs:256 #, csharp-format msgid "An error occured while loading the volume list: {0}" msgstr "Vyskytla sa chyba pri načítavaní zoznamu diskov: {0}" #: src/Gui/MainWindow.cs:300 msgid "Please enter the name for the new database" msgstr "Prosím vložte názov novej databáze" #: src/Gui/MainWindow.cs:312 msgid "Database exists" msgstr "Databáza už existuje" #: src/Gui/MainWindow.cs:313 msgid "Database already exists. Overwrite?" msgstr "Databáza už existuje. Chcete ju prepísať?" #: src/Gui/MainWindow.cs:326 msgid "Please select a database" msgstr "Vyberte prosím databázu" #: src/Gui/MainWindow.cs:335 src/Gui/Import.cs:83 msgid "Database not found." msgstr "Databáza sa nenašla." #: src/Gui/MainWindow.cs:356 #, csharp-format msgid "" "An error occured while accessing drive {0}:\n" "{1}" msgstr "" "Vyskytla sa chyba pri prístupe na jednotku {0}:\n" "{1}" #: src/Gui/MainWindow.cs:378 #, csharp-format msgid "Drive {0} is not ready." msgstr "Jednotka {0} nie je pripravená." #: src/Gui/MainWindow.cs:387 #, csharp-format msgid "Drive {0} is neither mounted nor does it contain an audio cd." msgstr "Jednotka {0} buď nie je pripojená, alebo neobsahuje zvukové CD." #: src/Gui/MainWindow.cs:406 msgid "Confirmation" msgstr "Potvrdenie" #: src/Gui/MainWindow.cs:407 msgid "Are you sure you really want to remove the selected volume?" msgstr "Skutočne chcete odstrániť vybraný disk?" #: src/Gui/MainWindow.cs:712 #, csharp-format msgid "Please insert volume '{0}'." msgstr "Prosím vložte disk '{0}'." #: src/Gui/MainWindow.cs:714 msgid "Waiting for volume" msgstr "Čakanie na disk" #: src/Gui/MainWindow.cs:966 msgid "Add Volume" msgstr "Pridať disk" #: src/Gui/MainWindow.cs:970 msgid "Search" msgstr "Hľadať" #: src/Gui/MainWindow.cs:973 msgid "App Menu" msgstr "Menu aplikácie" #: src/Gui/MainWindow.cs:979 msgid "_New Database" msgstr "_Nová databáza" #: src/Gui/MainWindow.cs:982 msgid "_Open Database" msgstr "_Otvoriť databázu" #: src/Gui/MainWindow.cs:985 msgid "Open Default Database" msgstr "Otvoriť štandardnú databázu" #: src/Gui/MainWindow.cs:991 msgid "Recent Databases" msgstr "Naposledy otvorené databáze" #: src/Gui/MainWindow.cs:998 msgid "_Import" msgstr "_Importovať" #: src/Gui/MainWindow.cs:1001 msgid "_Preferences" msgstr "Nas_tavenia" #: src/Gui/MainWindow.cs:1004 msgid "_Database Properties" msgstr "_Vlastnosti databáze" #: src/Gui/MainWindow.cs:1007 msgid "Info" msgstr "Podrobnosti" #: src/Gui/MainWindow.cs:1010 msgid "_Quit" msgstr "U_končiť" #: src/Gui/MainWindow.cs:1016 msgid "_Edit Volume" msgstr "_Upraviť disk" #: src/Gui/MainWindow.cs:1019 msgid "_Remove Volume" msgstr "_Premenovať disk" #: src/Gui/MainWindow.cs:1022 msgid "Rescan Volume" msgstr "Znovu prehľadať disk" #: src/Gui/MainWindow.cs:1034 msgid "Sort by" msgstr "Zoradiť podľa" #: src/Gui/MainWindow.cs:1037 msgid "Descending" msgstr "Zostupne" #: src/Gui/MainWindow.cs:1043 msgid "Date added" msgstr "Dátum pridania" #: src/Gui/MainWindow.cs:1044 msgid "Title" msgstr "Názov" #: src/Gui/MainWindow.cs:1045 msgid "Drivetype" msgstr "Typ jednotky" #: src/Gui/MainWindow.cs:1142 msgid "Filter volumes" msgstr "Filter diskov" #: src/Gui/Import.cs:29 msgid "Import" msgstr "Importovať" #: src/Gui/Import.cs:30 msgid "Abort" msgstr "Zrušiť" #: src/Gui/Import.cs:31 msgid "Please select a database." msgstr "Vyberte prosím databázu." #: src/Gui/Import.cs:72 #, csharp-format msgid "{0:0}% completed." msgstr "Dokončených {0:0} %." #: src/Gui/Import.cs:82 msgid "Import failed" msgstr "Import zlyhal" #: src/Gui/Import.cs:85 msgid "Import failed!" msgstr "Import zlyhal!" #: src/Gui/Import.cs:87 msgid "Import aborted." msgstr "Import bol zrušený." #: src/Gui/Import.cs:89 msgid "Import completed successfully." msgstr "Import bol úspešne dokončený." #: src/Gui/Import.cs:121 msgid "Import in progress" msgstr "Prebieha import" #: src/Gui/Import.cs:122 msgid "You must stop the import before closing this window." msgstr "Pred zatvorením tohoto okna musíte zastaviť import." #: src/Gui/Import.cs:148 msgid "Unknown format." msgstr "Neznámy formát." #: src/Gui/Import.cs:175 msgid "Import Database" msgstr "Importovať databázu" #: src/Gui/Import.cs:186 msgid "Please select a database to import" msgstr "Vyberte prosím databázu, ktorú chcete importovať" #: src/Gui/Import.cs:194 msgid "All supported formats" msgstr "Všetky podporované typy súborov" #: src/Gui/Import.cs:198 #, csharp-format msgid ".{0} files" msgstr "súbory .{0}" #: src/Gui/Import.cs:209 msgid "Database:" msgstr "Databáza:" #: src/Gui/Import.cs:210 msgid "Format:" msgstr "Formát:" #: src/Gui/ItemProperties.cs:29 msgid "Item Properties" msgstr "Vlastnosti položky" #: src/Gui/VolumeScanner.cs:116 msgid "Scanning started." msgstr "Prehľadávanie" #: src/Gui/VolumeScanner.cs:118 #, csharp-format msgid "Scanning of drive '{0}' started." msgstr "Prehľadávanie jednotky '{0}' sa začalo." #: src/Gui/VolumeScanner.cs:124 #, csharp-format msgid "" "Options: generate thumbs: {0}, extract metadata: {1}, discard symlinks: {2}, " "hashing: {3}." msgstr "" "Nastavenia: generovanie náhľadov: {0}, extrahovanie metadát {1}, " "odstraňovanie symbolických odkazov: {2}, vytváranie hashov: {3}." #: src/Gui/VolumeScanner.cs:131 #, csharp-format msgid "Options: MusicBrainz enabled: {0}" msgstr "Nastavenia: povolený MusicBrainz: {0}" #: src/Gui/VolumeScanner.cs:157 msgid "Time" msgstr "Čas" #: src/Gui/VolumeScanner.cs:161 msgid "Message" msgstr "Správa" #: src/Gui/VolumeScanner.cs:258 msgid "Stopping Scanner and performing rollback..." msgstr "Prehľadávanie sa zastavuje a rušia sa zmeny..." #: src/Gui/VolumeScanner.cs:268 msgid "yes" msgstr "áno" #: src/Gui/VolumeScanner.cs:268 msgid "no" msgstr "nie" #: src/Gui/VolumeScanner.cs:291 msgid "Scan in progress" msgstr "Prebieha prehľadávanie" #: src/Gui/VolumeScanner.cs:291 msgid "You must stop scanning before closing this window." msgstr "Pred zatvorením tohoto okna musíte zastaviť prehľadávanie." #: src/Gui/VolumeScanner.cs:346 #, csharp-format msgid "An unhandled exception occured ({0})." msgstr "Vyskytla sa neošetrená výnimka ({0})." #: src/Gui/VolumeScanner.cs:347 msgid "All database changes have been rolled back." msgstr "Všetky zmeny v databáze boli zrušené." #: src/Gui/VolumeScanner.cs:354 #, csharp-format msgid "Scanning failed. Reason: an unhandled exception occured ({0})." msgstr "Prehľadávanie zlyhalo kvôli neošetrenej výnimke ({0})." #: src/Gui/VolumeScanner.cs:356 msgid "Scanning aborted." msgstr "Prehľadávanie bolo zrušené." #: src/Gui/VolumeScanner.cs:358 msgid "Scanning completed successfully." msgstr "Prehľadávanie bolo úspešne dokončené." #: src/Gui/VolumeScanner.cs:488 msgid "VolumeScanner" msgstr "Prehľadávanie disku" #: src/Gui/VolumeScanner.cs:500 msgid "Volume Information:" msgstr "Informácie o disku:" #: src/Gui/VolumeScanner.cs:510 msgid "Scanner Log:" msgstr "Záznam prehľadávania:" #: src/Gui/VolumeScanner.cs:527 msgid "Database access" msgstr "Prístup k databázi" #: src/Gui/Preferences.cs:119 msgid "None" msgstr "Nič" #: src/Gui/Preferences.cs:228 msgid "Unsupported theme" msgstr "Nepodporovaný vzhľad" #: src/Gui/Preferences.cs:229 msgid "The selected icon theme is currently not supported on your system." msgstr "V súčasnosti nie je vybraný vzhľad ikon podporovaný." #: src/Gui/Preferences.cs:267 msgid "Restart required" msgstr "Je potrebný reštart" #: src/Gui/Preferences.cs:268 #, csharp-format msgid "You must restart {0} for icontheme changes to take effect." msgstr "Pre zmenu vzhľadu ikon musíte reštartartovať {0}." #: src/Gui/Preferences.cs:298 msgid "Preferences" msgstr "Nastavenia" #: src/Gui/Preferences.cs:322 msgid "_Load Defaults" msgstr "_Načítať štandardné nastavenia" #: src/Gui/Preferences.cs:349 msgid "Icon theme:" msgstr "Vzhľad ikon:" #: src/Gui/Preferences.cs:355 msgid "Reopen most recent database on startup" msgstr "Pri štarte otvoriť poslednú databázu" #: src/Gui/Preferences.cs:359 msgid "Show iteminfo panel" msgstr "Zobraziť panel s informáciami o položke" #: src/Gui/Preferences.cs:363 msgid "Show hidden files" msgstr "Zobraziť skryté súbory" #: src/Gui/Preferences.cs:367 msgid "Show thumbnails in the filebrowser" msgstr "Zobraziť náhľady v prehliadači súborov" #: src/Gui/Preferences.cs:370 msgid "General" msgstr "Všeobecné" #: src/Gui/Preferences.cs:378 msgid "Don't prompt, always scan:" msgstr "Vždy prehľadávaj:" #: src/Gui/Preferences.cs:397 msgid "Generate Thumbnails" msgstr "Vytváranie náhľadov" #: src/Gui/Preferences.cs:401 msgid "Extract metadata" msgstr "Extrahovanie metadát" #: src/Gui/Preferences.cs:405 msgid "Discard symbolic links" msgstr "Rušenie symbolických odkazov" #: src/Gui/Preferences.cs:409 msgid "Compute hashcodes for files (slow!)" msgstr "Vypočítavanie hash kódov súborov (pomalé!)" #: src/Gui/Preferences.cs:413 msgid "Fetch audio cd metadata from MusicBrainz.org" msgstr "Sťahovanie metadát pre zvukové CD z MusicBrainz.org" #: src/Gui/Preferences.cs:416 msgid "Scanner" msgstr "Prehľadávanie" Basenji/po/ru.resources0000664000175000017500000004172212067326706015326 0ustar patrickpatricklSystem.Resources.ResourceReader, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089#System.Resources.RuntimeResourceSetPADPADP̯[\ĒZFn_`/+ܽێyB_2 bJ䗖x~?ޘ ǚ˚}朮G  +Iљ,ޠ}ѬX`pѨE7kݏѝ!峸/# *?8 ڻMo;,锼xb5x,Qoĵgsv59}΍\$о DaрO51 թ}&ٍɬڴn^/gk䷧p$dF>?y7 Taq;͈nYDoY`rYrY$sYsYStYj~Ԕx06ez Z P4 * J  o> 8a c iz $ |q c O\mga}AKuQ>R j!ز$&P%%*U++1;v9`9vE:Iu:>Y@;CBsDH1L2Q;RfMSMeS@STXmޡY![[Page {0}/{1}</b> ({2} - {3} of {4} items)A&<b>Scanner Log:</b>4<b>Volume Information:</b>XA cross-platform media indexing/search tool. Abortu Added:VAll database changes have been rolled back.All filesAll items^An error occured while accessing drive {0}: {1}fAn error occured while loading the volume list: {0}IJAn unhandled exception occured ({0}).ApplicationsArchive No.Archive No.: Archives:vAre you sure you really want to remove the selected volume?H ArtistAudio CDAudio CD trackAudiobooks Author Backup Bytes!Category+Category:?FCompute hashcodes for files (slow!)TConfirmationCopyrightCopyright (c) Created:Creator2Database '{0}' not found.&Database Properties2Database accessZFDatabase already exists. Overwrite?Database exists$Database not found &Database not found.8Database:dDate added|FDefault database not found. Create?DescendingDescriptionDescription: Development Dimensions5 DirectoriesE Directories:W Directoryj ,Discard symbolic linksz Documents 4Don't prompt, always scan: Drive zDrive {0} is neither mounted nor does it contain an audio cd.5 .Drive {0} is not ready. Drivetype Duration Duration: Edit Item Error- Extract metadata; XFetch audio cd metadata from MusicBrainz.orgf File File count Files: Filesystem Filetype Filter volumes2 FormatK Format:Y DFound {0} items in {1:F3} seconds.h GB Games General &Generate Thumbnails Genre Hash Hashed: Icon theme: Images& Import> Import DatabaseZ Import aborted. POT-Creation-Date: 2012-07-15 15:49+0200 PO-Revision-Date: 2012-02-19 12:50+0000 Last-Translator: Sergey Shlyapugin Language-Team: Russian MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Launchpad-Export-Date: 2012-11-18 12:32+0000 X-Generator: Launchpad (build 16278) "{0}" - {1}. Ожидаемый формат: {2} Пожалуйста, исправьте или удалите введённые данные. (пусто)FСтраница {0}/{1} ({2} - {3} из {4} объектов)@Пошаговая запись действий сканера:+ Информаия о звуке: {Кроссплатформенный инструмент индексирования/поиска медиафайлов.ПрерватьДобавлено:DВсе изменения в базе данных отменены.Все файлыВсе элементы9Ошибка при доступе к диску {0}: {1}VОбнаружена ошибка при загрузке списка томов: {0}MВозникло необрабатываемое исключение ({0}).ПриложенияНомер архива:Номер архива: АрхивыVВы действительно хотите удалить выбранный том?ИсполнительAudio CDДорожка аудио CDАудиокниги АвторРезервная копияБайтКатегорияКатегория:DПосчитать хеш-коды для файлов (Долго!)ПодтверждениеАвторские праваCopyright (c) Создано: Автор.База данных '{0}'не найдена&Свойства базы данных%Доступ к базе данныхWТакая база данных уже существует. Перезаписать?1База данных уже существует)База данных не найдена*База данных не найдена.База данных:Дата добавленияKОсновная база данных не найдена. Создать?УбываниюОписаниеОписание:РазработкаРазмерыКаталогиКаталоги:Каталог;Отклонить символические ссылки.ДокументыAНе запрашивать, всегда сканировать:%Носитель информации\Диск {0} не подключен и не содержит звуковых данных.Диск {0} не готов.Тип накопителяДлительностьДлительность:'Редактировать объект Ошибка)Извлечения метаданных\Взять метаданные для аудио дисков с сайта MusicBrainz.orgФайл!Количество файлов Файлы:Файловая системаТип файлаФильтр томов Формат Формат:=Найдено {0} объектов за {1:F3} секунд.ГБИгры ОбщееСоздавать эскизыЖанрХэшХэширование:Тема иконокИзображенияИмпортировать0Импортировать базу данных-Импортирование отменено>Импортирование успешно завершено0Импортирование не удалось1Импортирование не удалось!%Идёт импортированиеНеверные данныеСвойства объектаТип объектаКБКлючевые словаКлючевые слова: МеткаЯзык*Время последней записиЗагрузка...Датай займа: Займ:РазмещениеМБСообщение Разное Фильмы МузыкаИмяНазвание:НетНет объектов.$Поиск ничего не дал.ОтсутствуетПримечание5Открыть основную базу данныхНазвание Опции1Функции: MusicBrainz включено: {0}Параметры: Предварительный просмотр: {0}, Извлечение мета-данных: {1}, Не ссылаться на символы: {2}, Хэшировать: {3}. Прочее#Количество страницИзображения]Пожалуйста, введите название для новой базы данных<Пожалуйста, выберите базу данных<Выберите базу данных для импортаOПожалуйста, выберите диск для сканированияНастройкиПродюсер&Недавние базы данныхbПовторное открытие последней базы данных при запуске'Требуется перезапускДата возврата:!Идёт сканирование Сканер*Сканирование прервано.;Сканирование успешно завершено.Не удалось произвести сканирование. Причина: необработанное исключение ({0}).AВыполняется сканирование диска '{0}'.0Выполняется сканирование.Поиск объектовПоиск записейИдёт поиск....Показывать скрытые файлы(Показать панель "iteminfo"dПоказывать эскизы изображений в окне просмотра файлов РазмерПрограммаСортировать поYОстановка сканера, возврат на исходную позицию...4Объект символической ссылкиТБ ТекстВыбранные темы значков в настоящее время не поддерживается на вашей системе.LЭта версия базы данных не поддерживается. ВремяПревышение лимита времени: еще один поиск, возможно, все еще продолжается.ЗаголовокНазвание:Слишком большое количество результатов поиска. Пожалуйста, уточните критерии поиска.Общий размер:Номер дорожки:Дорожки:ТипНеизвестныйБез имениCНеподдерживаемая версия базы данных'Непригодный материал'Используется VolumeDB v{0}. ВидеоТомСвойства томаТип тома:+Файлы томов базы данных'Глубина сканирования&Ожидание устройств...ГодДаxВы должны перезапустить {0} для применения изменений в теме иконокrВы должны остановить сканирование перед закрытием этого окна.vВы должны остановить импортирование перед тем, как закрыть окно.'_Свойства базы данных"_Редактировать том_Импортировать>З_агрузить параметры по умолчанию!_Новая база данных%_Открыть базу данных_Настройки _Выход_Удалить томотпо умолчанию файловотнетдорожекда{0:0}% завершено. {0} Байт"{0} уже выполняется."{0} томов загружено.Basenji/po/sk.resources0000664000175000017500000003605212067326706015315 0ustar patrickpatricklSystem.Resources.ResourceReader, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089#System.Resources.RuntimeResourceSetPADPADP̯[\ĒZFn_`/+ܽێyB_2 bJ䗖x~?ޘi ǚ˚}朮G  +Iљ,ޠ}ѬX`pѨE7kxbݏѝ!峸/# *?8 ڻMo;,锼xb5x,QoċƵgsv59}΍\$о DaрO51 թ}&ٍɬڴn^/gk䷧ 4pz$dF>?y7 Taq;͈nYDoY`rYrY$sYsYStYj~Ԕx06ez Z P4 * J  o> 8a c iz $ |q c  O\mg:a}AKuQ>R j!ز$&P%%**U++,Q-SP.1;v9`9vE:Iu:>Y@;CBsDHI1L2Q;RfMSMeS@STXmޡY![[Page {0}/{1}</b> ({2} - {3} of {4} items)1&<b>Scanner Log:</b>e4<b>Volume Information:</b>XA cross-platform media indexing/search tool. AbortAdd Volume Added: VAll database changes have been rolled back.All filesAAll itemsR*All supported formatsd^An error occured while accessing drive {0}: {1}fAn error occured while loading the volume list: {0}JAn unhandled exception occured ({0}).App Menu!Applications2Archive No.>Archive No.:PArchivescvAre you sure you really want to remove the selected volume?m ArtistAudio CDAudio CD trackAudiobooks Author Backup BytesCategoryCategory:Click on the icon to the left of the search field to build advanced search queries. Example: {0}FCompute hashcodes for files (slow!)ConfirmationCopyrightCopyright (c) Created:Creator2Database '{0}' not found.&Database PropertiesDatabase access3FDatabase already exists. Overwrite?IDatabase existsx$Database not found&Database not found.Database:Date addedFDefault database not found. Create?DescendingDescription Description:'Development/DimensionsEDirectoriesPDirectories:[Directoryg,Discard symbolic linksqDocuments4Don't prompt, always scan: DrivezDrive {0} is neither mounted nor does it contain an audio cd..Drive {0} is not ready.Drivetype"Duration0Duration:9Edit ItemC ErrorV Extract metadata]XFetch audio cd metadata from MusicBrainz.orgtFileFile count Files:FilesystemFiletypeFilter volumes FormatFormat: DFound {0} items in {1:F3} seconds. GB> GamesB GeneralG &Generate ThumbnailsT Genrel Hashu Hashed:{ Icon theme: Images Import Import Database Import aborted. NoG No items.L $No search results._ None~ Note *Open Default Database OptionName BOptions: MusicBrainz enabled: {0} Options: generate thumbs: {0}, extract metadata: {1}, discard symlinks: {2}, hashing: {3}. Otherq Page count{ Pictures TPlease enter the name for the new database DPlease insert volume '<b>{0}</b>'. 0Please select a database DPlease select a database to import 2Please select a database.1 :Please select a drive to scanM Preferencesz Producer Quick tip: Recent Databases LReopen most recent database on startup Rescan Volume Restart required Return date: Scan in progressScanner4"Scanning aborted.E@Scanning completed successfully.f|Scanning failed. Reason: an unhandled exception occured ({0}).@Scanning of drive '{0}' started."Scanning started. Search Search ItemsSearch items+Searching...?"Show hidden filesL&Show in Main Windowg&Show iteminfo panelDShow thumbnails in the filebrowserSizeSoftwareSort byVStopping Scanner and performing rollback...Symlink target3TBBTextFThe selected icon theme is currently not supported on your system.LNThis database version is not supported.TimelTimeout: another search is probably still in progress. Title Title:xToo many search results. Please refine your search criteria. Total size:yTrack No.Tracks:TypeUnknownUnknown format.Unnamed8Unsupported database version"Unsupported theme(Using VolumeDB v{0}. Videos) Volume1"Volume Properties7Volume type:I(VolumeDatabase filesVVolumeScannern*Waiting for drives...$Waiting for volumeYearYestYou must restart {0} for icontheme changes to take effect.dYou must stop scanning before closing this window.hYou must stop the import before closing this window.4(_Database Propertiesl_Edit Volume_Import_Load Defaults_New Database_Open Database_Preferences _Quit_Remove Volumebydefault files+from4no7 tracks<yesE"{0:0}% completed.K{0} Bytesc.{0} is already running.o&{0} volumes loaded.Project-Id-Version: basenji Report-Msgid-Bugs-To: FULL NAME POT-Creation-Date: 2012-07-15 15:49+0200 PO-Revision-Date: 2012-07-23 14:01+0000 Last-Translator: Izidor Matušov Language-Team: Slovak MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Launchpad-Export-Date: 2012-10-27 11:00+0000 X-Generator: Launchpad (build 16194) i"{0}" je {1} Očakávaný formát: {2} Prosím, opravte alebo odstráňte údaje v nesprávnom formáte. (prázdne) súbory .{0}2Strana {0}/{1} ({2} - {3} zo {4} položiek)Záznam prehľadávania:Informácie o disku:OMultiplatformný nástroj na indexovanie a vyhľadávanie medialných súborov.Zrušiť Pridať diskPridané)Všetky zmeny v databáze boli zrušené.Všetky súboryVšetky položky"Všetky podporované typy súborov4Vyskytla sa chyba pri prístupe na jednotku {0}: {1}7Vyskytla sa chyba pri načítavaní zoznamu diskov: {0}(Vyskytla sa neošetrená výnimka ({0}).Menu aplikácie AplikácieČíslo archívuČíslo archívu:Archívy+Skutočne chcete odstrániť vybraný disk? Interprét Zvukové CDSkladba na hudobnom CD AudioknihyAutorZálohabajtov Kategória KategóriaPre vytváranie zložitejších kritérií vyhľadávania kliknite na ikona vľavo od vyhľadávacieho políčka. Napríklad: {0}/Vypočítavanie hash kódov súborov (pomalé!) PotvrdenieAutorské právaCopyright (c)  Vytvorené:TvorcaDatabáza '{0}' sa nenašla.Vlastnosti databázePrístup k databázi-Databáza už existuje. Chcete ju prepísať?Databáza už existujeDatabáza sa nenašla.Databáza sa nenašla. Databáza:Dátum pridania7Nenašla sa predvolená databáza. Chcete ju vytvoriť?ZostupnePopisPopis:Vývojové nástroje Veľkosti Adresáre Adresáre:AdresárRušenie symbolických odkazov DokumentyVždy prehľadávaj:JednotkaBJednotka {0} buď nie je pripojená, alebo neobsahuje zvukové CD. Jednotka {0} nie je pripravená. Typ jednotkyDĺžkaDĺžka:Upraviť položkuChybaExtrahovanie metadát6Sťahovanie metadát pre zvukové CD z MusicBrainz.orgSúborPočet súborovSúborySúborový systém Typ súboru Filter diskovFormátFormát:+Najdených {0} položiek za {1:F3} sekúnd.GBHry VšeobecnéVytváranie náhľadovŽánerHashHash bol vytvorený: Vzhľad ikon:Obrázky ImportovaťImportovať databázuImport bol zrušený.!Import bol úspešne dokončený. Import zlyhalImport zlyhal!Prebieha import PodrobnostiNesprávne údajeVlastnosti položky Druh položkykBKľúčové slováKľúčové slová: OznačenieJazykČas posledného zápisu Nahrávam...Dátum pôžičky: Požičané: UmiestnenieMBSprávaRôzneFilmyHudbaNázovNázov:NieŽiadne položky.Nenašli sa žiadne položky.Nič PoznámkaOtvoriť štandardnú databázu MenoMožnosti&Nastavenia: povolený MusicBrainz: {0}Nastavenia: generovanie náhľadov: {0}, extrahovanie metadát {1}, odstraňovanie symbolických odkazov: {2}, vytváranie hashov: {3}.Ostatné Počet stránObrázky&Prosím vložte názov novej databáze"Prosím vložte disk '{0}'.Vyberte prosím databázu4Vyberte prosím databázu, ktorú chcete importovaťVyberte prosím databázu.+Vyberte jednotku, ktorá sa má prehľadať Nastavenia ProducentTip:Naposledy otvorené databáze(Pri štarte otvoriť poslednú databázuZnovu prehľadať diskJe potrebný reštart Vrátene:Prebieha prehľadávaniePrehľadávaniePrehľadávanie bolo zrušené.+Prehľadávanie bolo úspešne dokončené.;Prehľadávanie zlyhalo kvôli neošetrenej výnimke ({0}).*Prehľadávanie jednotky '{0}' sa začalo.PrehľadávanieHľadaťNájdené položkyHľadané položky Hľadám...Zobraziť skryté súboryZobraziť v hlavnom okne*Zobraziť panel s informáciami o položke+Zobraziť náhľady v prehliadači súborov VeľkosťProgramyZoradiť podľa1Prehľadávanie sa zastavuje a rušia sa zmeny... Symlink odkazTBText9V súčasnosti nie je vybraný vzhľad ikon podporovaný.+Táto verzia databáze nie je podporovaná.ČasTVypršal časový limit: pravdepodobne prebieha stále prebieha iné vyhľadávanie.NázovNázovWPríliš veľa výsledkov vyhľadávania. Prosím sprísnite kritériá vyhľadávania.Celková veľkosť:Číslo skladbySkladby:TypNeznámyNeznámy formát. Bez názvuNepodporovaná verzia databázeNepodporovaný vzhľadPoužíva VolumeDB v{0}VideáDiskVlastnosti disku Typ zväzkuSúbory VolumeDatabasePrehľadávanie diskuČakám na ovládače...Čakanie na diskRokÁno5Pre zmenu vzhľadu ikon musíte reštartartovať {0}.?Pred zatvorením tohoto okna musíte zastaviť prehľadávanie.6Pred zatvorením tohoto okna musíte zastaviť import._Vlastnosti databáze_Upraviť disk _Importovať#_Načítať štandardné nastavenia_Nová databáza_Otvoriť databázu Nas_tavenia U_končiť_Premenovať diskod štandardnýsúboryznieskladbyánoDokončených {0:0} %. {0} bajtov{0} je už spustené.Načítaných {0} diskov.Basenji/po/cs.po0000664000175000017500000005153312067326706013712 0ustar patrickpatrick# Czech translation for basenji # Copyright (c) 2011 Rosetta Contributors and Canonical Ltd 2011 # This file is distributed under the same license as the basenji package. # FIRST AUTHOR , 2011. # msgid "" msgstr "" "Project-Id-Version: basenji\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2012-07-15 15:49+0200\n" "PO-Revision-Date: 2012-02-08 10:29+0000\n" "Last-Translator: Konki \n" "Language-Team: Czech \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2012-10-27 11:00+0000\n" "X-Generator: Launchpad (build 16194)\n" #: src/Util.cs:30 #, csharp-format msgid "{0} Bytes" msgstr "{0} Bajtů" #: src/Util.cs:32 msgid "Bytes" msgstr "Bajty" #: src/Util.cs:32 msgid "KB" msgstr "kB" #: src/Util.cs:32 msgid "MB" msgstr "MB" #: src/Util.cs:32 msgid "GB" msgstr "GB" #: src/Util.cs:32 msgid "TB" msgstr "TB" #: src/Options.cs:477 msgid "OptionName" msgstr "JménoVolby" #: src/FileDialog.cs:51 msgid "VolumeDatabase files" msgstr "Databáze souborů svazku" #: src/FileDialog.cs:56 msgid "All files" msgstr "Všechny soubory" #: src/Main.cs:142 src/Gui/MainWindow.cs:76 src/Gui/MainWindow.cs:92 #: src/Gui/MainWindow.cs:334 src/Gui/MainWindow.cs:355 #: src/Gui/MainWindow.cs:377 src/Gui/MainWindow.cs:386 #: src/Gui/MainWindow.cs:635 msgid "Error" msgstr "Chyba" #: src/Main.cs:142 #, csharp-format msgid "{0} is already running." msgstr "{0} již běží." #: src/Gui/Widgets/VolumeView.cs:42 src/Gui/Widgets/SearchResultView.cs:30 msgid "Unnamed" msgstr "Bezejmenný" #: src/Gui/Widgets/VolumeView.cs:43 #: src/Gui/Widgets/Editors/VolumeEditor.cs:259 msgid "Category:" msgstr "Kategorie:" #: src/Gui/Widgets/VolumeView.cs:44 msgid "files" msgstr "soubory" #: src/Gui/Widgets/VolumeView.cs:45 msgid "tracks" msgstr "stopy" #: src/Gui/Widgets/ItemView.cs:29 msgid "Loading..." msgstr "Načítání..." #: src/Gui/Widgets/ItemView.cs:30 msgid "(empty)" msgstr "(prázdné)" #: src/Gui/Widgets/ItemView.cs:99 src/Gui/DriveSelection.cs:80 msgid "Unknown" msgstr "Neznámý" #: src/Gui/Widgets/ItemView.cs:170 src/Gui/Widgets/Editors/ItemEditor.cs:96 msgid "Name" msgstr "Název" #: src/Gui/Widgets/ItemView.cs:176 msgid "Artist" msgstr "Umělec" #: src/Gui/Widgets/ItemView.cs:181 #: src/Gui/Widgets/Editors/AudioTrackItemEditor.cs:53 #: src/Gui/Widgets/ItemInfo.cs:225 src/Gui/Widgets/ItemInfo.cs:288 msgid "Duration" msgstr "Délka" #: src/Gui/Widgets/Editors/FileSystemVolumeEditor.cs:34 #: src/Gui/DriveSelection.cs:168 msgid "Filesystem" msgstr "Systém souborů" #: src/Gui/Widgets/Editors/FileSystemVolumeEditor.cs:65 msgid "Files:" msgstr "Soubory:" #: src/Gui/Widgets/Editors/FileSystemVolumeEditor.cs:66 msgid "Directories:" msgstr "Adresáře:" #: src/Gui/Widgets/Editors/FileSystemVolumeEditor.cs:67 msgid "Total size:" msgstr "Celková velikost:" #: src/Gui/Widgets/Editors/ItemEditor.cs:95 msgid "Item type" msgstr "Typ položky" #: src/Gui/Widgets/Editors/ItemEditor.cs:111 src/Gui/Widgets/ItemInfo.cs:371 msgid "Note" msgstr "Poznámka" #: src/Gui/Widgets/Editors/ItemEditor.cs:112 src/Gui/Widgets/ItemInfo.cs:374 msgid "Keywords" msgstr "Klíčová slova" #: src/Gui/Widgets/Editors/AudioTrackItemEditor.cs:31 #: src/Gui/Widgets/SearchResultView.cs:34 msgid "Audio CD track" msgstr "Stopa audio cd" #: src/Gui/Widgets/Editors/AudioTrackItemEditor.cs:54 #: src/Gui/Widgets/ItemInfo.cs:230 msgid "Type" msgstr "Typ" #: src/Gui/Widgets/Editors/DirectoryItemEditor.cs:28 msgid "Directory" msgstr "Adresář" #: src/Gui/Widgets/Editors/FileSystemItemEditor.cs:59 #: src/Gui/Widgets/SearchResultView.cs:31 src/Gui/Widgets/ItemInfo.cs:183 msgid "Location" msgstr "Umístění" #: src/Gui/Widgets/Editors/FileSystemItemEditor.cs:60 #: src/Gui/Widgets/ItemInfo.cs:185 msgid "Last write time" msgstr "Poslední čas zápisu" #: src/Gui/Widgets/Editors/FileSystemItemEditor.cs:61 #: src/Gui/Widgets/ItemInfo.cs:210 msgid "Filetype" msgstr "Typ souboru" #: src/Gui/Widgets/Editors/FileItemEditor.cs:31 msgid "File" msgstr "Soubor" #: src/Gui/Widgets/Editors/FileItemEditor.cs:52 #: src/Gui/Widgets/ItemInfo.cs:204 src/Gui/Widgets/ItemInfo.cs:226 #: src/Gui/DriveSelection.cs:148 msgid "Size" msgstr "Velikost" #: src/Gui/Widgets/Editors/FileItemEditor.cs:53 #: src/Gui/Widgets/ItemInfo.cs:206 msgid "Hash" msgstr "Rozdělit" #: src/Gui/Widgets/Editors/AudioCdVolumeEditor.cs:33 msgid "Audio CD" msgstr "Audio CD" #: src/Gui/Widgets/Editors/AudioCdVolumeEditor.cs:63 msgid "Tracks:" msgstr "Stop:" #: src/Gui/Widgets/Editors/AudioCdVolumeEditor.cs:64 msgid "Duration:" msgstr "Délka:" #: src/Gui/Widgets/Editors/VolumeEditor.cs:45 msgid "Backup" msgstr "Zálohovat" #: src/Gui/Widgets/Editors/VolumeEditor.cs:46 #: src/Gui/Widgets/CategoryView.cs:60 msgid "Documents" msgstr "Dokumenty" #: src/Gui/Widgets/Editors/VolumeEditor.cs:47 #: src/Gui/Widgets/CategoryView.cs:61 msgid "Music" msgstr "Hudba" #: src/Gui/Widgets/Editors/VolumeEditor.cs:48 msgid "Audiobooks" msgstr "Mluvené knihy" #: src/Gui/Widgets/Editors/VolumeEditor.cs:49 #: src/Gui/Widgets/CategoryView.cs:62 msgid "Movies" msgstr "Filmy" #: src/Gui/Widgets/Editors/VolumeEditor.cs:50 msgid "Videos" msgstr "Videa" #: src/Gui/Widgets/Editors/VolumeEditor.cs:51 msgid "Pictures" msgstr "Obrázky" #: src/Gui/Widgets/Editors/VolumeEditor.cs:52 msgid "Games" msgstr "Hry" #: src/Gui/Widgets/Editors/VolumeEditor.cs:53 src/Gui/Widgets/ItemInfo.cs:319 msgid "Software" msgstr "Software" #: src/Gui/Widgets/Editors/VolumeEditor.cs:54 msgid "Misc" msgstr "Různé" #: src/Gui/Widgets/Editors/VolumeEditor.cs:55 msgid "Other" msgstr "Ostatní" #: src/Gui/Widgets/Editors/VolumeEditor.cs:225 msgid "Yes" msgstr "Ano" #: src/Gui/Widgets/Editors/VolumeEditor.cs:225 msgid "No" msgstr "Ne" #: src/Gui/Widgets/Editors/VolumeEditor.cs:235 msgid "Volume type:" msgstr "Typ svazku:" #: src/Gui/Widgets/Editors/VolumeEditor.cs:236 msgid "Hashed:" msgstr "Rozděleno:" #: src/Gui/Widgets/Editors/VolumeEditor.cs:237 msgid "Added:" msgstr "Přidáno:" #: src/Gui/Widgets/Editors/VolumeEditor.cs:258 msgid "Archive No.:" msgstr "Archiv č.:" #: src/Gui/Widgets/Editors/VolumeEditor.cs:260 msgid "Title:" msgstr "Název:" #: src/Gui/Widgets/Editors/VolumeEditor.cs:261 src/Gui/DBProperties.cs:98 msgid "Description:" msgstr "Popisek:" #: src/Gui/Widgets/Editors/VolumeEditor.cs:262 msgid "Keywords:" msgstr "Klíčová slova:" #: src/Gui/Widgets/Editors/VolumeEditor.cs:263 msgid "Loaned to:" msgstr "Půjčeno do:" #: src/Gui/Widgets/Editors/VolumeEditor.cs:264 msgid "Loaned date:" msgstr "Datum zapůjčení:" #: src/Gui/Widgets/Editors/VolumeEditor.cs:265 msgid "Return date:" msgstr "Datum vrácení:" #: src/Gui/Widgets/CategoryView.cs:58 msgid "Directories" msgstr "Adresáře" #: src/Gui/Widgets/CategoryView.cs:59 msgid "Text" msgstr "Text" #: src/Gui/Widgets/CategoryView.cs:63 msgid "Images" msgstr "Obrázky" #: src/Gui/Widgets/CategoryView.cs:64 msgid "Applications" msgstr "Aplikace" #: src/Gui/Widgets/CategoryView.cs:65 msgid "Archives" msgstr "Archivy" #: src/Gui/Widgets/CategoryView.cs:66 msgid "Development" msgstr "Vývoj" #: src/Gui/Widgets/CategoryView.cs:96 src/Gui/MainWindow.cs:1046 msgid "Category" msgstr "Skupina" #: src/Gui/Widgets/CategoryView.cs:128 msgid "All items" msgstr "Všechny položky" #: src/Gui/Widgets/SearchResultView.cs:32 msgid "Volume" msgstr "Svazek" #: src/Gui/Widgets/SearchResultView.cs:33 src/Gui/MainWindow.cs:1040 msgid "Archive No." msgstr "Archiv č." #: src/Gui/Widgets/ItemInfo.cs:40 msgid "by" msgstr "od" #: src/Gui/Widgets/ItemInfo.cs:41 msgid "from" msgstr "z" #: src/Gui/Widgets/ItemInfo.cs:196 msgid "Symlink target" msgstr "Cíl symlinku" #: src/Gui/Widgets/ItemInfo.cs:227 msgid "Track No." msgstr "Stopa č." #: src/Gui/Widgets/ItemInfo.cs:258 msgid "Genre" msgstr "Žánr" #: src/Gui/Widgets/ItemInfo.cs:278 msgid "Year" msgstr "Rok" #: src/Gui/Widgets/ItemInfo.cs:283 msgid "Description" msgstr "Popisek" #: src/Gui/Widgets/ItemInfo.cs:294 msgid "Dimensions" msgstr "Rozměrů" #: src/Gui/Widgets/ItemInfo.cs:299 msgid "Format" msgstr "Formát" #: src/Gui/Widgets/ItemInfo.cs:303 msgid "Author" msgstr "Autor" #: src/Gui/Widgets/ItemInfo.cs:307 msgid "Copyright" msgstr "Autorská práva" #: src/Gui/Widgets/ItemInfo.cs:311 msgid "Producer" msgstr "Producent" #: src/Gui/Widgets/ItemInfo.cs:315 msgid "Creator" msgstr "Tvůrce" #: src/Gui/Widgets/ItemInfo.cs:323 msgid "Language" msgstr "Jazyk" #: src/Gui/Widgets/ItemInfo.cs:327 msgid "Page count" msgstr "Počet stránek" #: src/Gui/Widgets/ItemInfo.cs:346 msgid "File count" msgstr "Počet souborů" #: src/Gui/Widgets/PageNavigation.cs:27 msgid "No items." msgstr "Žádné položky." #: src/Gui/Widgets/PageNavigation.cs:145 #, csharp-format msgid "Page {0}/{1} ({2} - {3} of {4} items)" msgstr "Stránka {0}/{1} ({2} - {3} z {4} položek)" #: src/Gui/ObjectProperties.cs:54 src/Gui/VolumeScanner.cs:248 msgid "Invalid data" msgstr "Neplatná data" #: src/Gui/ObjectProperties.cs:54 src/Gui/VolumeScanner.cs:249 #, csharp-format msgid "" "\"{0}\" is {1}.\n" "\n" "Expected format: {2}\n" "Please correct or remove the data you entered." msgstr "" "\"{0}\" je {1}.\n" "\n" "Předpokládaný formát: {2}\n" "Opravte nebo odstraňte zadaná data." #: src/Gui/DBProperties.cs:85 msgid "Database Properties" msgstr "Vlastnosti databáze" #: src/Gui/DBProperties.cs:97 msgid "Name:" msgstr "Název:" #: src/Gui/DBProperties.cs:99 msgid "Created:" msgstr "Vytvořeno:" #: src/Gui/VolumeProperties.cs:29 msgid "Volume Properties" msgstr "Vlastnosti svazku" #: src/Gui/DriveSelection.cs:60 msgid "Waiting for drives..." msgstr "Čeká se na mechaniky..." #: src/Gui/DriveSelection.cs:133 msgid "Drive" msgstr "Mechanika" #: src/Gui/DriveSelection.cs:139 msgid "Label" msgstr "Popisek" #: src/Gui/DriveSelection.cs:241 msgid "Please select a drive to scan" msgstr "Prosím zvolte mechaniku pro skenování" #: src/Gui/About.cs:28 msgid "A cross-platform media indexing/search tool." msgstr "Multiplatformní mediální indexovací/vyhledávací nástroj." #: src/Gui/About.cs:29 #, csharp-format msgid "Using VolumeDB v{0}." msgstr "Používá se VolumeDB v{0}." #: src/Gui/About.cs:31 msgid "Copyright (c) " msgstr "Autorská práva (c) " #: src/Gui/ItemSearch.cs:81 #, csharp-format msgid "Found {0} items in {1:F3} seconds." msgstr "Nalezeno {0} položek za {1:F3} vteřin." #: src/Gui/ItemSearch.cs:92 src/Gui/MainWindow.cs:519 msgid "Timeout: another search is probably still in progress." msgstr "Vypršel časový limit: pravděpodobně probíhá jiné vyhledávání." #: src/Gui/ItemSearch.cs:94 msgid "Too many search results. Please refine your search criteria." msgstr "" "Příliš mnoho výsledků vyhledávání. Prosím změňte vaše kritéria vyhledávání." #: src/Gui/ItemSearch.cs:112 src/Gui/MainWindow.cs:535 msgid "Searching..." msgstr "Vyhledávání…" #: src/Gui/ItemSearch.cs:267 msgid "Search Items" msgstr "Hledané položky" #: src/Gui/ItemSearch.cs:279 src/Gui/MainWindow.cs:1145 msgid "default" msgstr "výchozí" #: src/Gui/ItemSearch.cs:283 msgid "Search items" msgstr "Hledané položky" #: src/Gui/ItemSearch.cs:318 msgid "Quick tip:" msgstr "" #: src/Gui/ItemSearch.cs:319 #, csharp-format msgid "" "Click on the icon to the left of the search field to build advanced search " "queries.\n" "Example: {0}" msgstr "" #: src/Gui/ItemSearch.cs:326 msgid "No search results." msgstr "Žádné výsledky vyhledávání." #: src/Gui/ItemSearch.cs:375 src/Gui/MainWindow.cs:1028 msgid "Edit Item" msgstr "Upravit položku" #: src/Gui/ItemSearch.cs:382 msgid "Show in Main Window" msgstr "" #: src/Gui/MainWindow.cs:77 src/Gui/MainWindow.cs:93 src/Gui/MainWindow.cs:635 #, csharp-format msgid "Database '{0}' not found." msgstr "Databáze '{0}' nebyla nalezena." #: src/Gui/MainWindow.cs:185 msgid "Database not found" msgstr "Databáze nebyla nalezena" #: src/Gui/MainWindow.cs:186 msgid "Default database not found. Create?" msgstr "Výchozí databáze nebyla nalezena. Vytvořit?" #: src/Gui/MainWindow.cs:215 msgid "Unsupported database version" msgstr "Nepodporovaná verze databáze" #: src/Gui/MainWindow.cs:216 msgid "This database version is not supported." msgstr "Tato verze databáze není podporována." #: src/Gui/MainWindow.cs:235 #, csharp-format msgid "{0} volumes loaded." msgstr "{0} svazků načteno." #: src/Gui/MainWindow.cs:256 #, csharp-format msgid "An error occured while loading the volume list: {0}" msgstr "Během nahrávání seznamu svazků se vyskytla chyba: {0}" #: src/Gui/MainWindow.cs:300 msgid "Please enter the name for the new database" msgstr "Vložte název pro novou databázi" #: src/Gui/MainWindow.cs:312 msgid "Database exists" msgstr "Databáze existuje" #: src/Gui/MainWindow.cs:313 msgid "Database already exists. Overwrite?" msgstr "Databáze již existuje. Přepsat?" #: src/Gui/MainWindow.cs:326 msgid "Please select a database" msgstr "Prosím vyberte databázi" #: src/Gui/MainWindow.cs:335 src/Gui/Import.cs:83 msgid "Database not found." msgstr "Databáze nebyla nalezena." #: src/Gui/MainWindow.cs:356 #, csharp-format msgid "" "An error occured while accessing drive {0}:\n" "{1}" msgstr "" "Vyskytla se chyba během přístupu k jednotce {0}:\n" "{1}" #: src/Gui/MainWindow.cs:378 #, csharp-format msgid "Drive {0} is not ready." msgstr "Jednotka {0} není připravena." #: src/Gui/MainWindow.cs:387 #, csharp-format msgid "Drive {0} is neither mounted nor does it contain an audio cd." msgstr "" #: src/Gui/MainWindow.cs:406 msgid "Confirmation" msgstr "Potvrzení" #: src/Gui/MainWindow.cs:407 msgid "Are you sure you really want to remove the selected volume?" msgstr "Opravdu chcete odstranit vybraný svazek?" #: src/Gui/MainWindow.cs:712 #, csharp-format msgid "Please insert volume '{0}'." msgstr "" #: src/Gui/MainWindow.cs:714 msgid "Waiting for volume" msgstr "" #: src/Gui/MainWindow.cs:966 msgid "Add Volume" msgstr "" #: src/Gui/MainWindow.cs:970 msgid "Search" msgstr "" #: src/Gui/MainWindow.cs:973 msgid "App Menu" msgstr "" #: src/Gui/MainWindow.cs:979 msgid "_New Database" msgstr "_Nová databáze" #: src/Gui/MainWindow.cs:982 msgid "_Open Database" msgstr "_Otevřít databázi" #: src/Gui/MainWindow.cs:985 msgid "Open Default Database" msgstr "Otevřít standardní databázi." #: src/Gui/MainWindow.cs:991 msgid "Recent Databases" msgstr "Poslední databáze" #: src/Gui/MainWindow.cs:998 msgid "_Import" msgstr "_Importovat" #: src/Gui/MainWindow.cs:1001 msgid "_Preferences" msgstr "_Předvolby" #: src/Gui/MainWindow.cs:1004 msgid "_Database Properties" msgstr "_Vlastnosti databáze" #: src/Gui/MainWindow.cs:1007 msgid "Info" msgstr "" #: src/Gui/MainWindow.cs:1010 msgid "_Quit" msgstr "_Ukončit" #: src/Gui/MainWindow.cs:1016 msgid "_Edit Volume" msgstr "_Upravit svazek" #: src/Gui/MainWindow.cs:1019 msgid "_Remove Volume" msgstr "_Odstranit svazek" #: src/Gui/MainWindow.cs:1022 msgid "Rescan Volume" msgstr "" #: src/Gui/MainWindow.cs:1034 msgid "Sort by" msgstr "Řadit podle" #: src/Gui/MainWindow.cs:1037 msgid "Descending" msgstr "Sestupně" #: src/Gui/MainWindow.cs:1043 msgid "Date added" msgstr "Datum přidání" #: src/Gui/MainWindow.cs:1044 msgid "Title" msgstr "Název" #: src/Gui/MainWindow.cs:1045 msgid "Drivetype" msgstr "Typ jednotky" #: src/Gui/MainWindow.cs:1142 msgid "Filter volumes" msgstr "Filtr svazků" #: src/Gui/Import.cs:29 msgid "Import" msgstr "Přidat" #: src/Gui/Import.cs:30 msgid "Abort" msgstr "Zrušit" #: src/Gui/Import.cs:31 msgid "Please select a database." msgstr "" #: src/Gui/Import.cs:72 #, csharp-format msgid "{0:0}% completed." msgstr "{0:0}% dokončeno." #: src/Gui/Import.cs:82 msgid "Import failed" msgstr "Přidání selhalo" #: src/Gui/Import.cs:85 msgid "Import failed!" msgstr "Přidání selhalo!" #: src/Gui/Import.cs:87 msgid "Import aborted." msgstr "Přidání bylo zrušeno." #: src/Gui/Import.cs:89 msgid "Import completed successfully." msgstr "Přidání bylo úspěšně dokončeno." #: src/Gui/Import.cs:121 msgid "Import in progress" msgstr "Přidávání v průběhu" #: src/Gui/Import.cs:122 msgid "You must stop the import before closing this window." msgstr "Před uzavřením tohoto okna musíte ukončit importování." #: src/Gui/Import.cs:148 msgid "Unknown format." msgstr "" #: src/Gui/Import.cs:175 msgid "Import Database" msgstr "Importovat databázi" #: src/Gui/Import.cs:186 msgid "Please select a database to import" msgstr "Prosím vyberte databázi k importování" #: src/Gui/Import.cs:194 msgid "All supported formats" msgstr "" #: src/Gui/Import.cs:198 #, csharp-format msgid ".{0} files" msgstr "" #: src/Gui/Import.cs:209 msgid "Database:" msgstr "Databáze:" #: src/Gui/Import.cs:210 msgid "Format:" msgstr "Formát:" #: src/Gui/ItemProperties.cs:29 msgid "Item Properties" msgstr "Vlastnosti položky" #: src/Gui/VolumeScanner.cs:116 msgid "Scanning started." msgstr "Skenování začalo." #: src/Gui/VolumeScanner.cs:118 #, csharp-format msgid "Scanning of drive '{0}' started." msgstr "Skenování jednotky '{0}' začalo." #: src/Gui/VolumeScanner.cs:124 #, csharp-format msgid "" "Options: generate thumbs: {0}, extract metadata: {1}, discard symlinks: {2}, " "hashing: {3}." msgstr "" #: src/Gui/VolumeScanner.cs:131 #, csharp-format msgid "Options: MusicBrainz enabled: {0}" msgstr "Volby: MusicBrainz zapnutý: {0}" #: src/Gui/VolumeScanner.cs:157 msgid "Time" msgstr "Čas" #: src/Gui/VolumeScanner.cs:161 msgid "Message" msgstr "Zpráva" #: src/Gui/VolumeScanner.cs:258 msgid "Stopping Scanner and performing rollback..." msgstr "Zastavuje se skener a provádí se navracení..." #: src/Gui/VolumeScanner.cs:268 msgid "yes" msgstr "ano" #: src/Gui/VolumeScanner.cs:268 msgid "no" msgstr "ne" #: src/Gui/VolumeScanner.cs:291 msgid "Scan in progress" msgstr "Probíhá skenování" #: src/Gui/VolumeScanner.cs:291 msgid "You must stop scanning before closing this window." msgstr "Před uzavřením musíte ukončit skenování." #: src/Gui/VolumeScanner.cs:346 #, csharp-format msgid "An unhandled exception occured ({0})." msgstr "Vyskytla se neošetřená vyjímka ({0})." #: src/Gui/VolumeScanner.cs:347 msgid "All database changes have been rolled back." msgstr "Všechny změny v databázi byly vráceny zpět." #: src/Gui/VolumeScanner.cs:354 #, csharp-format msgid "Scanning failed. Reason: an unhandled exception occured ({0})." msgstr "Skenování selhalo. Důvod: nastala neošetřená vyjímka ({0})." #: src/Gui/VolumeScanner.cs:356 msgid "Scanning aborted." msgstr "Skenování bylo zrušeno." #: src/Gui/VolumeScanner.cs:358 msgid "Scanning completed successfully." msgstr "Skenování bylo úspěšně dokončeno." #: src/Gui/VolumeScanner.cs:488 msgid "VolumeScanner" msgstr "SkenerSvazku" #: src/Gui/VolumeScanner.cs:500 msgid "Volume Information:" msgstr "Informace o svazku:" #: src/Gui/VolumeScanner.cs:510 msgid "Scanner Log:" msgstr "Záznam skenování:" #: src/Gui/VolumeScanner.cs:527 msgid "Database access" msgstr "Přístup k databázi" #: src/Gui/Preferences.cs:119 msgid "None" msgstr "Nic" #: src/Gui/Preferences.cs:228 msgid "Unsupported theme" msgstr "Nepodporovaný motiv" #: src/Gui/Preferences.cs:229 msgid "The selected icon theme is currently not supported on your system." msgstr "Vybraný motiv ikony není aktuálně podporovaný ve vašem systému." #: src/Gui/Preferences.cs:267 msgid "Restart required" msgstr "Vyžadován restart" #: src/Gui/Preferences.cs:268 #, csharp-format msgid "You must restart {0} for icontheme changes to take effect." msgstr "Je nutný restart {0} , aby změna schémat ikon měla nějaký efekt." #: src/Gui/Preferences.cs:298 msgid "Preferences" msgstr "Předvolby" #: src/Gui/Preferences.cs:322 msgid "_Load Defaults" msgstr "_Načíst výchozí nastavení" #: src/Gui/Preferences.cs:349 msgid "Icon theme:" msgstr "Motiv ikony:" #: src/Gui/Preferences.cs:355 msgid "Reopen most recent database on startup" msgstr "Znovu otevřít poslední databázi při startu" #: src/Gui/Preferences.cs:359 msgid "Show iteminfo panel" msgstr "Zobrazit panel systémových informací" #: src/Gui/Preferences.cs:363 msgid "Show hidden files" msgstr "Zobrazit skryté soubory" #: src/Gui/Preferences.cs:367 msgid "Show thumbnails in the filebrowser" msgstr "Zobrazovat náhledy v prohlížeči souborů" #: src/Gui/Preferences.cs:370 msgid "General" msgstr "Obecné" #: src/Gui/Preferences.cs:378 msgid "Don't prompt, always scan:" msgstr "Nedotazovat se, vždy skenovat:" #: src/Gui/Preferences.cs:397 msgid "Generate Thumbnails" msgstr "Generování náhledů" #: src/Gui/Preferences.cs:401 msgid "Extract metadata" msgstr "Extrahovat metadata" #: src/Gui/Preferences.cs:405 msgid "Discard symbolic links" msgstr "Vyřadit symbolické odkazy" #: src/Gui/Preferences.cs:409 msgid "Compute hashcodes for files (slow!)" msgstr "Vypočítat hashkódy pro soubory (pomalé!)" #: src/Gui/Preferences.cs:413 msgid "Fetch audio cd metadata from MusicBrainz.org" msgstr "Získat metadata audio cd z MusicBrainz.org" #: src/Gui/Preferences.cs:416 msgid "Scanner" msgstr "Skener" Basenji/po/oc.resources0000664000175000017500000002331012067326706015272 0ustar patrickpatricklSystem.Resources.ResourceReader, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089#System.Resources.RuntimeResourceSetPADPADP̯[\Fn_`ܽyB_2J䗖x~?ޘ ǚ˚}朮G  +Iљ,ޠ}ѬX`pѨE7kݏѝ!峸/ *? ڻMo;,锼xb5x,Qoĵg59}΍\$о DaрO}&ٍɬڴn^/k䷧p$󄪧F>?y7 Taq;͈nYDoY`rYrY$sYsYStYj6P4 * J  o> 8a c iz $ |q c mga}Q>R j!%*U++1;v9`9vE:Iu:>Y@;CBsDH1L2Q;RfMSMeS@STX![[&__㦍a] bObfZgahj[l8npLsKt8uuxUuxjv1vݷ wqWx;n|~|q|oт|т|؂||}$|xT|e|)|*#|~~[ l 9 x?A  |P a /n  Rt, $ )f $M:<' m ~oz ]Y P PwG  Z  cb`/ K L J   iFc uDi &U   ])`t I&3  7~ 0 r > q- T(empty)Z<b>Page {0}/{1}</b> ({2} - {3} of {4} items)&<b>Scanner Log:</b>4<b>Volume Information:</b> Abort@ Added:KAll filesWAll itemslApplicationsArchive No.Archive No.:Archives ArtistAudio CDAudio CD trackAudiobooks Author Backup BytesCategoryCategory:ConfirmationCopyright+Copyright (c) <Created:LCreatorY2Database '{0}' not found.b&Database PropertiesDatabase accessDatabase exists$Database not found&Database not found.Database:%Date added:FDefault database not found. Create?FDescendingDescriptionDescription:DevelopmentDimensionsDirectoriesDirectories:Directory,Discard symbolic linksDocuments Drive.Drive {0} is not ready.&DurationDDuration:LEdit ItemW Errorm Extract metadatatFileFile count Files:FilesystemFiletypeFilter volumes FormatFormat:DFound {0} items in {1:F3} seconds.GB; Games@GeneralG&Generate ThumbnailsP GenrenHashuHashed:Icon theme: Images ImportImport DatabaseImport aborted. POT-Creation-Date: 2012-07-15 15:49+0200 PO-Revision-Date: 2011-09-03 17:35+0000 Last-Translator: Cédric VALMARY (Tot en òc) Language-Team: Occitan (post 1500) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Launchpad-Export-Date: 2012-10-27 11:00+0000 X-Generator: Launchpad (build 16194) (void)4Pagina {0}/{1} ({2} - {3} sus {4} objèctes)Resultat de l'analisi : Information sul mèdia : Abandonar Apondut :Totes los fichièrsTotes los objèctes Aplicacions N° d'ArchiuN° d'archiu :ArchiusArtista CD àudioPista CD Àudio Libres àudioAutor SalvamentOctets Categoria Categoria : ConfirmacionDreches d'autorCopyright (c)  Creat lo :Creator"Banca de donadas '{0}' introbabla."Proprietats de la banca de donadasAccès a la banca de donadasLa banca de donadas existís jaBanca de donadas pas trobadaBanca de donadas introbabla.Banca de donadas : Apondut lo=Banca de donadas per defaut pas trobada. Crear una novèla ?Òrdre descreissent DescripcionDescripcion : Desvolopament Dimensions Dorsièrs Dorsièrs :DorsièrIgnorar los ligams simbolics DocumentsLectorLo lector {0} es pas prèst.Durada Durada :Modificar un elementErrorExtraccion de las metadonadasFichièrNombre de fichièrs Fichièrs :Sistèma de fichièrsTipe de fichièrFiltrar los mèdiasFormat Format :(Trobat {0} objèctes en {1:F3} segondas.GioJòcsGeneralGeneracion de las miniaturasGenre Emprencha Emprencha :Tèma d'icònas :ImatgesImportarImpòrt de la banca de donadasImportacion abandonada.Impòrt acabat amb succès.L'importacion a pas capitatError d'importacion !Importacion en corsDonada invalidaPropietats de l'elementTipe d'elementKio Mots claus Mots claus :EtiquetaLengaDarrièr enregistramentCargament en cors...Data de prèst : Prestats a : EmplaçamentMioMessatgeDivèrsFilmesMusicaNomNom :NonPas cap d'objècte. Pas cap de resultat de recèrca.Pas capNòtaDobrir la BDD per defautNom de l'opcion%Opcions : MusicBrainz activada : {0}AutreNombre de paginasImatges,Seleccionatz una banca de donadas d'importar!Seleccionatz lo lector d'analisar Preferéncias Productor!Vos cal tornar amodar l'ordenadorData de retorn :Analisi en corsScannerAnalisi interrompuda.Analisi acabada amb succès.%Aviada de l'analisi del lector '{0}'.Analisi aviada.Objèctes recercatsRecèrca en cors...Afichar los fichièrs amagatsTalhaLogicial Triar per5Arrèst de l'analisi e anullacion dels cambiaments...destinacion del ligamTioTèxteOraTítol Títol :Talha totala : N° de Pista Pistas :Tipe DesconegutSens nom)Version de banca de donadas pas suportadaUtilizatz VolumeDB v{0}.VidèosVolumProprietats del MèdiaTipe de mèdia :Fichièrs VolumeDatabase VolumeScannerEspèra dels lectors...AnnadaÒc9Vos cal reamodar {0} per aplicar lo cambiament del tèma._Proprietats BDD_Editar un Mèdia _Importar_Cargar defauts BDD _novèla D_obrir BDD_Preferéncias_Quitar_Suprimir un Mèdiaper per defaut fichièrsdenonpistasòc{0:0}% realizat. {0} Octets{0} es en cors de tractament.{0} mèdias cargats.Basenji/po/sr.po0000664000175000017500000006075612067326706013740 0ustar patrickpatrick# Serbian translation for basenji # Copyright (c) 2010 Rosetta Contributors and Canonical Ltd 2010 # This file is distributed under the same license as the basenji package. # FIRST AUTHOR , 2010. # Мирослав Николић , 2012. msgid "" msgstr "" "Project-Id-Version: basenji\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2012-07-15 15:49+0200\n" "PO-Revision-Date: 2012-10-30 08:48+0000\n" "Last-Translator: Мирослав Николић \n" "Language-Team: Serbian translators\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2012-11-18 12:32+0000\n" "X-Generator: Launchpad (build 16278)\n" "Language: sr\n" #: src/Util.cs:30 #, csharp-format msgid "{0} Bytes" msgstr "Бајтова: {0}" #: src/Util.cs:32 msgid "Bytes" msgstr "Бајтова" #: src/Util.cs:32 msgid "KB" msgstr "KB" #: src/Util.cs:32 msgid "MB" msgstr "MB" #: src/Util.cs:32 msgid "GB" msgstr "GB" #: src/Util.cs:32 msgid "TB" msgstr "TB" #: src/Options.cs:477 msgid "OptionName" msgstr "Додатни назив" #: src/FileDialog.cs:51 msgid "VolumeDatabase files" msgstr "Датотеке базе података" #: src/FileDialog.cs:56 msgid "All files" msgstr "Све датотеке" #: src/Main.cs:142 src/Gui/MainWindow.cs:76 src/Gui/MainWindow.cs:92 #: src/Gui/MainWindow.cs:334 src/Gui/MainWindow.cs:355 #: src/Gui/MainWindow.cs:377 src/Gui/MainWindow.cs:386 #: src/Gui/MainWindow.cs:635 msgid "Error" msgstr "Грешка" #: src/Main.cs:142 #, csharp-format msgid "{0} is already running." msgstr "{0} је већ покренут." #: src/Gui/Widgets/VolumeView.cs:42 src/Gui/Widgets/SearchResultView.cs:30 msgid "Unnamed" msgstr "Неименовано" #: src/Gui/Widgets/VolumeView.cs:43 #: src/Gui/Widgets/Editors/VolumeEditor.cs:259 msgid "Category:" msgstr "Категорије:" #: src/Gui/Widgets/VolumeView.cs:44 msgid "files" msgstr "датотеке" #: src/Gui/Widgets/VolumeView.cs:45 msgid "tracks" msgstr "нумере" #: src/Gui/Widgets/ItemView.cs:29 msgid "Loading..." msgstr "Учитавам..." #: src/Gui/Widgets/ItemView.cs:30 msgid "(empty)" msgstr "(празно)" #: src/Gui/Widgets/ItemView.cs:99 src/Gui/DriveSelection.cs:80 msgid "Unknown" msgstr "Непознато" #: src/Gui/Widgets/ItemView.cs:170 src/Gui/Widgets/Editors/ItemEditor.cs:96 msgid "Name" msgstr "Назив" #: src/Gui/Widgets/ItemView.cs:176 msgid "Artist" msgstr "Извођач" #: src/Gui/Widgets/ItemView.cs:181 #: src/Gui/Widgets/Editors/AudioTrackItemEditor.cs:53 #: src/Gui/Widgets/ItemInfo.cs:225 src/Gui/Widgets/ItemInfo.cs:288 msgid "Duration" msgstr "Трајање" #: src/Gui/Widgets/Editors/FileSystemVolumeEditor.cs:34 #: src/Gui/DriveSelection.cs:168 msgid "Filesystem" msgstr "Систем датотека" #: src/Gui/Widgets/Editors/FileSystemVolumeEditor.cs:65 msgid "Files:" msgstr "Датотеке:" #: src/Gui/Widgets/Editors/FileSystemVolumeEditor.cs:66 msgid "Directories:" msgstr "Фасцикле:" #: src/Gui/Widgets/Editors/FileSystemVolumeEditor.cs:67 msgid "Total size:" msgstr "Укупна величина:" #: src/Gui/Widgets/Editors/ItemEditor.cs:95 msgid "Item type" msgstr "Врста ставке" #: src/Gui/Widgets/Editors/ItemEditor.cs:111 src/Gui/Widgets/ItemInfo.cs:371 msgid "Note" msgstr "Белешка" #: src/Gui/Widgets/Editors/ItemEditor.cs:112 src/Gui/Widgets/ItemInfo.cs:374 msgid "Keywords" msgstr "Кључне речи" #: src/Gui/Widgets/Editors/AudioTrackItemEditor.cs:31 #: src/Gui/Widgets/SearchResultView.cs:34 msgid "Audio CD track" msgstr "Нумере звучног ЦД-а" #: src/Gui/Widgets/Editors/AudioTrackItemEditor.cs:54 #: src/Gui/Widgets/ItemInfo.cs:230 msgid "Type" msgstr "Врста" #: src/Gui/Widgets/Editors/DirectoryItemEditor.cs:28 msgid "Directory" msgstr "Фасцикла" #: src/Gui/Widgets/Editors/FileSystemItemEditor.cs:59 #: src/Gui/Widgets/SearchResultView.cs:31 src/Gui/Widgets/ItemInfo.cs:183 msgid "Location" msgstr "Место" #: src/Gui/Widgets/Editors/FileSystemItemEditor.cs:60 #: src/Gui/Widgets/ItemInfo.cs:185 msgid "Last write time" msgstr "Време последњег уписивања" #: src/Gui/Widgets/Editors/FileSystemItemEditor.cs:61 #: src/Gui/Widgets/ItemInfo.cs:210 msgid "Filetype" msgstr "Врста датотеке" #: src/Gui/Widgets/Editors/FileItemEditor.cs:31 msgid "File" msgstr "Датотека" #: src/Gui/Widgets/Editors/FileItemEditor.cs:52 #: src/Gui/Widgets/ItemInfo.cs:204 src/Gui/Widgets/ItemInfo.cs:226 #: src/Gui/DriveSelection.cs:148 msgid "Size" msgstr "Величина" #: src/Gui/Widgets/Editors/FileItemEditor.cs:53 #: src/Gui/Widgets/ItemInfo.cs:206 msgid "Hash" msgstr "Хеш" #: src/Gui/Widgets/Editors/AudioCdVolumeEditor.cs:33 msgid "Audio CD" msgstr "Аудио ЦД" #: src/Gui/Widgets/Editors/AudioCdVolumeEditor.cs:63 msgid "Tracks:" msgstr "Нумере:" #: src/Gui/Widgets/Editors/AudioCdVolumeEditor.cs:64 msgid "Duration:" msgstr "Трајање:" #: src/Gui/Widgets/Editors/VolumeEditor.cs:45 msgid "Backup" msgstr "Резерва" #: src/Gui/Widgets/Editors/VolumeEditor.cs:46 #: src/Gui/Widgets/CategoryView.cs:60 msgid "Documents" msgstr "Документи" #: src/Gui/Widgets/Editors/VolumeEditor.cs:47 #: src/Gui/Widgets/CategoryView.cs:61 msgid "Music" msgstr "Музика" #: src/Gui/Widgets/Editors/VolumeEditor.cs:48 msgid "Audiobooks" msgstr "Звучне књиге" #: src/Gui/Widgets/Editors/VolumeEditor.cs:49 #: src/Gui/Widgets/CategoryView.cs:62 msgid "Movies" msgstr "Филмови" #: src/Gui/Widgets/Editors/VolumeEditor.cs:50 msgid "Videos" msgstr "Снимци" #: src/Gui/Widgets/Editors/VolumeEditor.cs:51 msgid "Pictures" msgstr "Слике" #: src/Gui/Widgets/Editors/VolumeEditor.cs:52 msgid "Games" msgstr "Игре" #: src/Gui/Widgets/Editors/VolumeEditor.cs:53 src/Gui/Widgets/ItemInfo.cs:319 msgid "Software" msgstr "Програми" #: src/Gui/Widgets/Editors/VolumeEditor.cs:54 msgid "Misc" msgstr "Разно" #: src/Gui/Widgets/Editors/VolumeEditor.cs:55 msgid "Other" msgstr "Остало" #: src/Gui/Widgets/Editors/VolumeEditor.cs:225 msgid "Yes" msgstr "Да" #: src/Gui/Widgets/Editors/VolumeEditor.cs:225 msgid "No" msgstr "Не" #: src/Gui/Widgets/Editors/VolumeEditor.cs:235 msgid "Volume type:" msgstr "Врста диска:" #: src/Gui/Widgets/Editors/VolumeEditor.cs:236 msgid "Hashed:" msgstr "Хеширано:" #: src/Gui/Widgets/Editors/VolumeEditor.cs:237 msgid "Added:" msgstr "Додато:" #: src/Gui/Widgets/Editors/VolumeEditor.cs:258 msgid "Archive No.:" msgstr "Архива бр.:" #: src/Gui/Widgets/Editors/VolumeEditor.cs:260 msgid "Title:" msgstr "Наслов:" #: src/Gui/Widgets/Editors/VolumeEditor.cs:261 src/Gui/DBProperties.cs:98 msgid "Description:" msgstr "Опис:" #: src/Gui/Widgets/Editors/VolumeEditor.cs:262 msgid "Keywords:" msgstr "Кључне речи:" #: src/Gui/Widgets/Editors/VolumeEditor.cs:263 msgid "Loaned to:" msgstr "Изнајмљена:" #: src/Gui/Widgets/Editors/VolumeEditor.cs:264 msgid "Loaned date:" msgstr "Датум изнајмљивања:" #: src/Gui/Widgets/Editors/VolumeEditor.cs:265 msgid "Return date:" msgstr "Датум враћања:" #: src/Gui/Widgets/CategoryView.cs:58 msgid "Directories" msgstr "Фасцикле" #: src/Gui/Widgets/CategoryView.cs:59 msgid "Text" msgstr "Текст" #: src/Gui/Widgets/CategoryView.cs:63 msgid "Images" msgstr "Слике" #: src/Gui/Widgets/CategoryView.cs:64 msgid "Applications" msgstr "Програми" #: src/Gui/Widgets/CategoryView.cs:65 msgid "Archives" msgstr "Архиве" #: src/Gui/Widgets/CategoryView.cs:66 msgid "Development" msgstr "Развој" #: src/Gui/Widgets/CategoryView.cs:96 src/Gui/MainWindow.cs:1046 msgid "Category" msgstr "Категорија" #: src/Gui/Widgets/CategoryView.cs:128 msgid "All items" msgstr "Све ставке" #: src/Gui/Widgets/SearchResultView.cs:32 msgid "Volume" msgstr "Запис" #: src/Gui/Widgets/SearchResultView.cs:33 src/Gui/MainWindow.cs:1040 msgid "Archive No." msgstr "Архива бр." #: src/Gui/Widgets/ItemInfo.cs:40 msgid "by" msgstr "од" #: src/Gui/Widgets/ItemInfo.cs:41 msgid "from" msgstr "од" #: src/Gui/Widgets/ItemInfo.cs:196 msgid "Symlink target" msgstr "Одредиште симболичке везе" #: src/Gui/Widgets/ItemInfo.cs:227 msgid "Track No." msgstr "Нумера бр." #: src/Gui/Widgets/ItemInfo.cs:258 msgid "Genre" msgstr "Жанр" #: src/Gui/Widgets/ItemInfo.cs:278 msgid "Year" msgstr "Година" #: src/Gui/Widgets/ItemInfo.cs:283 msgid "Description" msgstr "Опис" #: src/Gui/Widgets/ItemInfo.cs:294 msgid "Dimensions" msgstr "Димензије" #: src/Gui/Widgets/ItemInfo.cs:299 msgid "Format" msgstr "Формат" #: src/Gui/Widgets/ItemInfo.cs:303 msgid "Author" msgstr "Аутор" #: src/Gui/Widgets/ItemInfo.cs:307 msgid "Copyright" msgstr "Ауторска права" #: src/Gui/Widgets/ItemInfo.cs:311 msgid "Producer" msgstr "Произвођач" #: src/Gui/Widgets/ItemInfo.cs:315 msgid "Creator" msgstr "Творац" #: src/Gui/Widgets/ItemInfo.cs:323 msgid "Language" msgstr "Језик" #: src/Gui/Widgets/ItemInfo.cs:327 msgid "Page count" msgstr "Број страница" #: src/Gui/Widgets/ItemInfo.cs:346 msgid "File count" msgstr "Број датотека" #: src/Gui/Widgets/PageNavigation.cs:27 msgid "No items." msgstr "Нема ставки." #: src/Gui/Widgets/PageNavigation.cs:145 #, csharp-format msgid "Page {0}/{1} ({2} - {3} of {4} items)" msgstr "Страна {0}/{1} (ставке {2} — {3} од {4})" #: src/Gui/ObjectProperties.cs:54 src/Gui/VolumeScanner.cs:248 msgid "Invalid data" msgstr "Неисправни подаци" #: src/Gui/ObjectProperties.cs:54 src/Gui/VolumeScanner.cs:249 #, csharp-format msgid "" "\"{0}\" is {1}.\n" "\n" "Expected format: {2}\n" "Please correct or remove the data you entered." msgstr "" "„{0}“ је {1}.\n" "\n" "Очекивани облик: {2}\n" "Исправите или уклоните податке које сте унели." #: src/Gui/DBProperties.cs:85 msgid "Database Properties" msgstr "Својства базе података" #: src/Gui/DBProperties.cs:97 msgid "Name:" msgstr "Назив:" #: src/Gui/DBProperties.cs:99 msgid "Created:" msgstr "Направљено:" #: src/Gui/VolumeProperties.cs:29 msgid "Volume Properties" msgstr "Својства записа" #: src/Gui/DriveSelection.cs:60 msgid "Waiting for drives..." msgstr "Чекам на уређаје..." #: src/Gui/DriveSelection.cs:133 msgid "Drive" msgstr "Уређај" #: src/Gui/DriveSelection.cs:139 msgid "Label" msgstr "Ознака" #: src/Gui/DriveSelection.cs:241 msgid "Please select a drive to scan" msgstr "Одаберите диск за скенирање" #: src/Gui/About.cs:28 msgid "A cross-platform media indexing/search tool." msgstr "Вишеплатформски алат за пописивање/претраживање медија." #: src/Gui/About.cs:29 #, csharp-format msgid "Using VolumeDB v{0}." msgstr "Користим издање {0} БП волумена." #: src/Gui/About.cs:31 msgid "Copyright (c) " msgstr "Ауторска права (c) " #: src/Gui/ItemSearch.cs:81 #, csharp-format msgid "Found {0} items in {1:F3} seconds." msgstr "Нађох {0} ставки за {1:F3} секунде." #: src/Gui/ItemSearch.cs:92 src/Gui/MainWindow.cs:519 msgid "Timeout: another search is probably still in progress." msgstr "Време истека: друга претрага вероватно још траје." #: src/Gui/ItemSearch.cs:94 msgid "Too many search results. Please refine your search criteria." msgstr "Пронађох превише резултата. Сузите услов претраге." #: src/Gui/ItemSearch.cs:112 src/Gui/MainWindow.cs:535 msgid "Searching..." msgstr "Тражим..." #: src/Gui/ItemSearch.cs:267 msgid "Search Items" msgstr "Тражи ставке" #: src/Gui/ItemSearch.cs:279 src/Gui/MainWindow.cs:1145 msgid "default" msgstr "основни" #: src/Gui/ItemSearch.cs:283 msgid "Search items" msgstr "Тражите ставке" #: src/Gui/ItemSearch.cs:318 msgid "Quick tip:" msgstr "Брза помоћ:" #: src/Gui/ItemSearch.cs:319 #, csharp-format msgid "" "Click on the icon to the left of the search field to build advanced search " "queries.\n" "Example: {0}" msgstr "" "Кликните на иконицу са леве стране поља за претрагу да изградите упите " "напредне претраге.\n" "Пример: {0}" #: src/Gui/ItemSearch.cs:326 msgid "No search results." msgstr "Нема резултата претраге." #: src/Gui/ItemSearch.cs:375 src/Gui/MainWindow.cs:1028 msgid "Edit Item" msgstr "Измени ставку" #: src/Gui/ItemSearch.cs:382 msgid "Show in Main Window" msgstr "Прикажи у главном прозору" #: src/Gui/MainWindow.cs:77 src/Gui/MainWindow.cs:93 src/Gui/MainWindow.cs:635 #, csharp-format msgid "Database '{0}' not found." msgstr "База података „{0}“ није пронађена." #: src/Gui/MainWindow.cs:185 msgid "Database not found" msgstr "База података није пронађена" #: src/Gui/MainWindow.cs:186 msgid "Default database not found. Create?" msgstr "Основна база података није пронађена. Да је направим?" #: src/Gui/MainWindow.cs:215 msgid "Unsupported database version" msgstr "Издање базе података није подржано" #: src/Gui/MainWindow.cs:216 msgid "This database version is not supported." msgstr "Ово издање базе података није подржано." #: src/Gui/MainWindow.cs:235 #, csharp-format msgid "{0} volumes loaded." msgstr "Учитаних записа: {0}." #: src/Gui/MainWindow.cs:256 #, csharp-format msgid "An error occured while loading the volume list: {0}" msgstr "Дошло је до грешке приликом учитавања списка записа: {0}" #: src/Gui/MainWindow.cs:300 msgid "Please enter the name for the new database" msgstr "Унесите назив за нову базу података" #: src/Gui/MainWindow.cs:312 msgid "Database exists" msgstr "База података постоји" #: src/Gui/MainWindow.cs:313 msgid "Database already exists. Overwrite?" msgstr "База података већ постоји. Да је препишем?" #: src/Gui/MainWindow.cs:326 msgid "Please select a database" msgstr "Изаберите базу података" #: src/Gui/MainWindow.cs:335 src/Gui/Import.cs:83 msgid "Database not found." msgstr "База података није пронађена." #: src/Gui/MainWindow.cs:356 #, csharp-format msgid "" "An error occured while accessing drive {0}:\n" "{1}" msgstr "" "Дошло је до грешке приликом приступања уређају „{0}“:\n" "{1}" #: src/Gui/MainWindow.cs:378 #, csharp-format msgid "Drive {0} is not ready." msgstr "Уређај „{0}“ није спреман." #: src/Gui/MainWindow.cs:387 #, csharp-format msgid "Drive {0} is neither mounted nor does it contain an audio cd." msgstr "Уређај „{0}“ није ни постављен нити садржи звучни ЦД." #: src/Gui/MainWindow.cs:406 msgid "Confirmation" msgstr "Потврда" #: src/Gui/MainWindow.cs:407 msgid "Are you sure you really want to remove the selected volume?" msgstr "Да ли сте сигурни да заиста желите да уклоните изабрани запис?" #: src/Gui/MainWindow.cs:712 #, csharp-format msgid "Please insert volume '{0}'." msgstr "Молим уметните запис „{0}“." #: src/Gui/MainWindow.cs:714 msgid "Waiting for volume" msgstr "Чекам на запис" #: src/Gui/MainWindow.cs:966 msgid "Add Volume" msgstr "Додај запис" #: src/Gui/MainWindow.cs:970 msgid "Search" msgstr "Потражи" #: src/Gui/MainWindow.cs:973 msgid "App Menu" msgstr "Изборник програма" #: src/Gui/MainWindow.cs:979 msgid "_New Database" msgstr "_Нова база података" #: src/Gui/MainWindow.cs:982 msgid "_Open Database" msgstr "_Отвори базу података" #: src/Gui/MainWindow.cs:985 msgid "Open Default Database" msgstr "Отворите основну базу података" #: src/Gui/MainWindow.cs:991 msgid "Recent Databases" msgstr "Недавна база података" #: src/Gui/MainWindow.cs:998 msgid "_Import" msgstr "_Увези" #: src/Gui/MainWindow.cs:1001 msgid "_Preferences" msgstr "_Поставке" #: src/Gui/MainWindow.cs:1004 msgid "_Database Properties" msgstr "_Својства базе података" #: src/Gui/MainWindow.cs:1007 msgid "Info" msgstr "Подаци" #: src/Gui/MainWindow.cs:1010 msgid "_Quit" msgstr "_Изађи" #: src/Gui/MainWindow.cs:1016 msgid "_Edit Volume" msgstr "У_реди запис" #: src/Gui/MainWindow.cs:1019 msgid "_Remove Volume" msgstr "У_клони запис" #: src/Gui/MainWindow.cs:1022 msgid "Rescan Volume" msgstr "Поново прегледај запис" #: src/Gui/MainWindow.cs:1034 msgid "Sort by" msgstr "Поређај према" #: src/Gui/MainWindow.cs:1037 msgid "Descending" msgstr "Опадајућем реду" #: src/Gui/MainWindow.cs:1043 msgid "Date added" msgstr "Датуму уноса" #: src/Gui/MainWindow.cs:1044 msgid "Title" msgstr "Наслову" #: src/Gui/MainWindow.cs:1045 msgid "Drivetype" msgstr "Врсти уређаја" #: src/Gui/MainWindow.cs:1142 msgid "Filter volumes" msgstr "Филтрирај записе" #: src/Gui/Import.cs:29 msgid "Import" msgstr "Увези" #: src/Gui/Import.cs:30 msgid "Abort" msgstr "Обустави" #: src/Gui/Import.cs:31 msgid "Please select a database." msgstr "Молим изаберите базу података." #: src/Gui/Import.cs:72 #, csharp-format msgid "{0:0}% completed." msgstr "Завршено је: {0:0}%." #: src/Gui/Import.cs:82 msgid "Import failed" msgstr "Увоз није успео" #: src/Gui/Import.cs:85 msgid "Import failed!" msgstr "Увоз није успео!" #: src/Gui/Import.cs:87 msgid "Import aborted." msgstr "Увоз је прекинут." #: src/Gui/Import.cs:89 msgid "Import completed successfully." msgstr "Увоз је успешно завршен." #: src/Gui/Import.cs:121 msgid "Import in progress" msgstr "Увоз је у току" #: src/Gui/Import.cs:122 msgid "You must stop the import before closing this window." msgstr "Морате зауставити увоз пре него што затворите овај прозор." #: src/Gui/Import.cs:148 msgid "Unknown format." msgstr "Непознат облик." #: src/Gui/Import.cs:175 msgid "Import Database" msgstr "Увези базу података" #: src/Gui/Import.cs:186 msgid "Please select a database to import" msgstr "Изаберите базу података за увоз" #: src/Gui/Import.cs:194 msgid "All supported formats" msgstr "Сви подржани облици" #: src/Gui/Import.cs:198 #, csharp-format msgid ".{0} files" msgstr ".{0} датотеке" #: src/Gui/Import.cs:209 msgid "Database:" msgstr "База података:" #: src/Gui/Import.cs:210 msgid "Format:" msgstr "Облик:" #: src/Gui/ItemProperties.cs:29 msgid "Item Properties" msgstr "Својства ставке" #: src/Gui/VolumeScanner.cs:116 msgid "Scanning started." msgstr "Скенирање је почело." #: src/Gui/VolumeScanner.cs:118 #, csharp-format msgid "Scanning of drive '{0}' started." msgstr "Скенирање диска „{0}“ је почело." #: src/Gui/VolumeScanner.cs:124 #, csharp-format msgid "" "Options: generate thumbs: {0}, extract metadata: {1}, discard symlinks: {2}, " "hashing: {3}." msgstr "" "Опције: прављење сличица: {0}, извлачење метаподатака: {1}, одбацивање " "симболичких веза: {2}, хеширање: {3}." #: src/Gui/VolumeScanner.cs:131 #, csharp-format msgid "Options: MusicBrainz enabled: {0}" msgstr "Опције: укључен Мозгић музике: {0}" #: src/Gui/VolumeScanner.cs:157 msgid "Time" msgstr "Време" #: src/Gui/VolumeScanner.cs:161 msgid "Message" msgstr "Порука" #: src/Gui/VolumeScanner.cs:258 msgid "Stopping Scanner and performing rollback..." msgstr "Заустављам скенирање и враћам на претходно стање..." #: src/Gui/VolumeScanner.cs:268 msgid "yes" msgstr "да" #: src/Gui/VolumeScanner.cs:268 msgid "no" msgstr "не" #: src/Gui/VolumeScanner.cs:291 msgid "Scan in progress" msgstr "Скенирање је у току" #: src/Gui/VolumeScanner.cs:291 msgid "You must stop scanning before closing this window." msgstr "Морате зауставити скенирање пре него што затворите овај прозор." #: src/Gui/VolumeScanner.cs:346 #, csharp-format msgid "An unhandled exception occured ({0})." msgstr "Дошло је до неочекиване грешке ({0})." #: src/Gui/VolumeScanner.cs:347 msgid "All database changes have been rolled back." msgstr "Све измене на бази података су поништене." #: src/Gui/VolumeScanner.cs:354 #, csharp-format msgid "Scanning failed. Reason: an unhandled exception occured ({0})." msgstr "Скенирање није успело. Разлог: дошло је до неочекиване грешке ({0})." #: src/Gui/VolumeScanner.cs:356 msgid "Scanning aborted." msgstr "Скенирање је прекинуто." #: src/Gui/VolumeScanner.cs:358 msgid "Scanning completed successfully." msgstr "Скенирање је успешно завршено." #: src/Gui/VolumeScanner.cs:488 msgid "VolumeScanner" msgstr "Скенер дискова" #: src/Gui/VolumeScanner.cs:500 msgid "Volume Information:" msgstr "Подаци о запису:" #: src/Gui/VolumeScanner.cs:510 msgid "Scanner Log:" msgstr "Дневник скенирања:" #: src/Gui/VolumeScanner.cs:527 msgid "Database access" msgstr "Приступ базама података" #: src/Gui/Preferences.cs:119 msgid "None" msgstr "Ништа" #: src/Gui/Preferences.cs:228 msgid "Unsupported theme" msgstr "Неподржана тема" #: src/Gui/Preferences.cs:229 msgid "The selected icon theme is currently not supported on your system." msgstr "Изабрана тема иконица тренутно није подржана на вашем систему." #: src/Gui/Preferences.cs:267 msgid "Restart required" msgstr "Потребно је поновно покретање" #: src/Gui/Preferences.cs:268 #, csharp-format msgid "You must restart {0} for icontheme changes to take effect." msgstr "Морате поново да покренете {0} да би се тема за иконице применила." #: src/Gui/Preferences.cs:298 msgid "Preferences" msgstr "Поставке" #: src/Gui/Preferences.cs:322 msgid "_Load Defaults" msgstr "_Учитај основно" #: src/Gui/Preferences.cs:349 msgid "Icon theme:" msgstr "Тема иконица:" #: src/Gui/Preferences.cs:355 msgid "Reopen most recent database on startup" msgstr "Приликом покретања отвори најсвежију базу података" #: src/Gui/Preferences.cs:359 msgid "Show iteminfo panel" msgstr "Прикажи поље са информацијама" #: src/Gui/Preferences.cs:363 msgid "Show hidden files" msgstr "Прикажи скривене датотеке" #: src/Gui/Preferences.cs:367 msgid "Show thumbnails in the filebrowser" msgstr "Прикажи сличице у претраживачу датотека" #: src/Gui/Preferences.cs:370 msgid "General" msgstr "Опште" #: src/Gui/Preferences.cs:378 msgid "Don't prompt, always scan:" msgstr "Не постављај упит већ одмах скенирај:" #: src/Gui/Preferences.cs:397 msgid "Generate Thumbnails" msgstr "Направи сличице" #: src/Gui/Preferences.cs:401 msgid "Extract metadata" msgstr "Извуци метаподатке" #: src/Gui/Preferences.cs:405 msgid "Discard symbolic links" msgstr "Одбаци симболичке везе" #: src/Gui/Preferences.cs:409 msgid "Compute hashcodes for files (slow!)" msgstr "Израчунај хеш резултат за датотеке (споро!)" #: src/Gui/Preferences.cs:413 msgid "Fetch audio cd metadata from MusicBrainz.org" msgstr "Прибави метаподатке за аудио ЦД са Мозгића музике" #: src/Gui/Preferences.cs:416 msgid "Scanner" msgstr "Скенер" Basenji/po/fr.resources0000664000175000017500000003533312067326706015310 0ustar patrickpatricklSystem.Resources.ResourceReader, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089#System.Resources.RuntimeResourceSetPADPADP̯[\ĒZFn_`/+ܽێyB_2 bJ䗖x~?ޘ ǚ˚}朮G  +Iљ,ޠ}ѬX`pѨE7kxbݏѝ!峸/# *?8 ڻMo;,锼xb5x,QoċƵgsv59}΍\$о DaрO51 թ}&ٍɬڴn^/gk䷧ 4pz$dF>?y7 Taq;͈nYDoY`rYrY$sYsYStYj~Ԕx06ez Z P4 * J  o> 8a c iz $ |q c O\mg:a}AKuQ>R j!ز$&P%%**U++SP.1;v9`9vE:Iu:>Y@;CBsDHI1L2Q;RfMSMeS@STXmޡY![[ 4T@Q@th G n Ef  # 4 @;{)? J  X =rFF cYmiO Ow Ur i  M+K P } I3[&"{0}" is {1}. Expected format: {2} Please correct or remove the data you entered.(empty).{0} filesZ<b>Page {0}/{1}</b> ({2} - {3} of {4} items)&<b>Scanner Log:</b>94<b>Volume Information:</b>ZXA cross-platform media indexing/search tool.~ AbortAdd Volume Added:VAll database changes have been rolled back.All files All items3*All supported formatsD^An error occured while accessing drive {0}: {1}afAn error occured while loading the volume list: {0}JAn unhandled exception occured ({0}).App MenuApplications(Archive No.4Archive No.:AArchivesRvAre you sure you really want to remove the selected volume?\ ArtistAudio CDAudio CD trackAudiobooks Author Backup BytesCategoryCategory:FCompute hashcodes for files (slow!)Confirmation>CopyrightLCopyright (c) WCreated:gCreatorq2Database '{0}' not found.|&Database PropertiesDatabase accessFDatabase already exists. Overwrite?Database exists$Database not found=&Database not found.\Database:{Date addedFDefault database not found. Create?DescendingDescriptionDescription:DevelopmentDimensionsDirectories$Directories:.Directory:,Discard symbolic linksCDocumentsb4Don't prompt, always scan:m DrivezDrive {0} is neither mounted nor does it contain an audio cd..Drive {0} is not ready.DrivetypeDuration Duration:Edit Item Error5 Extract metadata=XFetch audio cd metadata from MusicBrainz.org[FileFile count Files:FilesystemFiletypeFilter volumes FormatFormat: DFound {0} items in {1:F3} seconds. GB2 Games6 General< &Generate ThumbnailsG Genred Hashk Hashed:t Icon theme: Images Import Import Database Import aborted. &Show in Main Window]&Show iteminfo panelDShow thumbnails in the filebrowserSizeSoftwareSort byVStopping Scanner and performing rollback... Symlink target@TBUTextYThe selected icon theme is currently not supported on your system.`NThis database version is not supported.TimelTimeout: another search is probably still in progress. TitleG Title:NxToo many search results. Please refine your search criteria.WTotal size:Track No.Tracks:TypeUnknownUnknown format.Unnamed8Unsupported database version"Unsupported theme!(Using VolumeDB v{0}.< VideosZ Volumec"Volume PropertieskVolume type:(VolumeDatabase filesVolumeScanner*Waiting for drives...YearYestYou must restart {0} for icontheme changes to take effect.dYou must stop scanning before closing this window.'hYou must stop the import before closing this window.o(_Database Properties_Edit Volume_Import_Load Defaults_New Database_Open Database _Preferences _Quit(_Remove Volume2byEdefaultJ filesSfrom]noa tracksfyesn"{0:0}% completed.s{0} Bytes.{0} is already running.&{0} volumes loaded.Project-Id-Version: basenji Report-Msgid-Bugs-To: FULL NAME POT-Creation-Date: 2012-07-15 15:49+0200 PO-Revision-Date: 2012-07-03 10:21+0000 Last-Translator: Tubuntu Language-Team: French MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Launchpad-Export-Date: 2012-10-27 11:00+0000 X-Generator: Launchpad (build 16194) \"{0}" est {1}. Format attendu : {2} Vous devez corriger ou supprimer les données entrées.(vide) .{0} fichiers/Page {0}/{1} ({2} - {3} sur {4} objets)Résultat de l'analyse :"Information sur le média :BUn outil multi-plateforme d'indexation et de recherche de médias. AbandonnerAjout d'un volumeAjouté:3Tous les changements de la base ont été annulés.Tous les fichiersTous les objetsTous les formats supportés=Une erreur est survenue lors de l'accès au lecteur {0} : {1}GUne erreur est survenue lors du chargement des données du média : {0}*Une erreur non gérée est survenue ({0}).Menu Applications Programmes No. ArchiveNo. d'archive :Archives8Voulez-vous vraiment supprimé le média sélectionné ?ArtisteCD AudioPiste CD Audio Livres AudioAuteur SauvegardeOctets Catégorie Catégorie :?Calcule la somme de contrôle pour chaque fichier (plus lent !) Confirmation CopyrightCopyright (c) Créé : Créateur#Base de données '{0}' introuvable.#Propriétés de la base de donnéesAccès à la base de données4Cette base de données existe déjà. La remplacer ? La base de donnée existe déjàBase de données non trouvéeBase de données introuvable.Base de données : Date d'ajout?Base de donnée par défaut non trouvée. Créer une nouvelle ? Décroissant Description Description :Développement DimensionsDossiers Dossiers :DossierIgnorer les liens symboliques Documents%Toujours analyser sans confirmation :Lecteur, 2010. # msgid "" msgstr "" "Project-Id-Version: basenji\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2012-07-15 15:49+0200\n" "PO-Revision-Date: 2011-05-03 16:47+0000\n" "Last-Translator: olavi tohver \n" "Language-Team: Estonian \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2012-10-27 11:00+0000\n" "X-Generator: Launchpad (build 16194)\n" #: src/Util.cs:30 #, csharp-format msgid "{0} Bytes" msgstr "{0} baiti" #: src/Util.cs:32 msgid "Bytes" msgstr "Baiti" #: src/Util.cs:32 msgid "KB" msgstr "KB" #: src/Util.cs:32 msgid "MB" msgstr "MB" #: src/Util.cs:32 msgid "GB" msgstr "GB" #: src/Util.cs:32 msgid "TB" msgstr "TB" #: src/Options.cs:477 msgid "OptionName" msgstr "OptionName" #: src/FileDialog.cs:51 msgid "VolumeDatabase files" msgstr "VolumeDatabase failid (.vdb)" #: src/FileDialog.cs:56 msgid "All files" msgstr "Kõik failid" #: src/Main.cs:142 src/Gui/MainWindow.cs:76 src/Gui/MainWindow.cs:92 #: src/Gui/MainWindow.cs:334 src/Gui/MainWindow.cs:355 #: src/Gui/MainWindow.cs:377 src/Gui/MainWindow.cs:386 #: src/Gui/MainWindow.cs:635 msgid "Error" msgstr "Viga" #: src/Main.cs:142 #, csharp-format msgid "{0} is already running." msgstr "{0} juba töötab." #: src/Gui/Widgets/VolumeView.cs:42 src/Gui/Widgets/SearchResultView.cs:30 msgid "Unnamed" msgstr "Nimetu" #: src/Gui/Widgets/VolumeView.cs:43 #: src/Gui/Widgets/Editors/VolumeEditor.cs:259 msgid "Category:" msgstr "Kategooria:" #: src/Gui/Widgets/VolumeView.cs:44 msgid "files" msgstr "failid" #: src/Gui/Widgets/VolumeView.cs:45 msgid "tracks" msgstr "palad" #: src/Gui/Widgets/ItemView.cs:29 msgid "Loading..." msgstr "Laadimine..." #: src/Gui/Widgets/ItemView.cs:30 msgid "(empty)" msgstr "(tühi)" #: src/Gui/Widgets/ItemView.cs:99 src/Gui/DriveSelection.cs:80 msgid "Unknown" msgstr "Tundmatu" #: src/Gui/Widgets/ItemView.cs:170 src/Gui/Widgets/Editors/ItemEditor.cs:96 msgid "Name" msgstr "Nimi" #: src/Gui/Widgets/ItemView.cs:176 msgid "Artist" msgstr "Esitaja" #: src/Gui/Widgets/ItemView.cs:181 #: src/Gui/Widgets/Editors/AudioTrackItemEditor.cs:53 #: src/Gui/Widgets/ItemInfo.cs:225 src/Gui/Widgets/ItemInfo.cs:288 msgid "Duration" msgstr "Kestus" #: src/Gui/Widgets/Editors/FileSystemVolumeEditor.cs:34 #: src/Gui/DriveSelection.cs:168 msgid "Filesystem" msgstr "Failisüsteem" #: src/Gui/Widgets/Editors/FileSystemVolumeEditor.cs:65 msgid "Files:" msgstr "Failid:" #: src/Gui/Widgets/Editors/FileSystemVolumeEditor.cs:66 msgid "Directories:" msgstr "Kaustad:" #: src/Gui/Widgets/Editors/FileSystemVolumeEditor.cs:67 msgid "Total size:" msgstr "Kogu maht:" #: src/Gui/Widgets/Editors/ItemEditor.cs:95 msgid "Item type" msgstr "Kirje tüüp" #: src/Gui/Widgets/Editors/ItemEditor.cs:111 src/Gui/Widgets/ItemInfo.cs:371 msgid "Note" msgstr "Märkmed" #: src/Gui/Widgets/Editors/ItemEditor.cs:112 src/Gui/Widgets/ItemInfo.cs:374 msgid "Keywords" msgstr "Märksõnad" #: src/Gui/Widgets/Editors/AudioTrackItemEditor.cs:31 #: src/Gui/Widgets/SearchResultView.cs:34 msgid "Audio CD track" msgstr "Audio CD lugu" #: src/Gui/Widgets/Editors/AudioTrackItemEditor.cs:54 #: src/Gui/Widgets/ItemInfo.cs:230 msgid "Type" msgstr "Tüüp" #: src/Gui/Widgets/Editors/DirectoryItemEditor.cs:28 msgid "Directory" msgstr "Kataloog" #: src/Gui/Widgets/Editors/FileSystemItemEditor.cs:59 #: src/Gui/Widgets/SearchResultView.cs:31 src/Gui/Widgets/ItemInfo.cs:183 msgid "Location" msgstr "Asukoht" #: src/Gui/Widgets/Editors/FileSystemItemEditor.cs:60 #: src/Gui/Widgets/ItemInfo.cs:185 msgid "Last write time" msgstr "Viimati muudetud" #: src/Gui/Widgets/Editors/FileSystemItemEditor.cs:61 #: src/Gui/Widgets/ItemInfo.cs:210 msgid "Filetype" msgstr "Failitüüp" #: src/Gui/Widgets/Editors/FileItemEditor.cs:31 msgid "File" msgstr "Fail" #: src/Gui/Widgets/Editors/FileItemEditor.cs:52 #: src/Gui/Widgets/ItemInfo.cs:204 src/Gui/Widgets/ItemInfo.cs:226 #: src/Gui/DriveSelection.cs:148 msgid "Size" msgstr "Suurus" #: src/Gui/Widgets/Editors/FileItemEditor.cs:53 #: src/Gui/Widgets/ItemInfo.cs:206 msgid "Hash" msgstr "Kontrollsumma" #: src/Gui/Widgets/Editors/AudioCdVolumeEditor.cs:33 msgid "Audio CD" msgstr "Audio CD" #: src/Gui/Widgets/Editors/AudioCdVolumeEditor.cs:63 msgid "Tracks:" msgstr "Rajad:" #: src/Gui/Widgets/Editors/AudioCdVolumeEditor.cs:64 msgid "Duration:" msgstr "Kestus:" #: src/Gui/Widgets/Editors/VolumeEditor.cs:45 msgid "Backup" msgstr "Varunda" #: src/Gui/Widgets/Editors/VolumeEditor.cs:46 #: src/Gui/Widgets/CategoryView.cs:60 msgid "Documents" msgstr "Dokumendid" #: src/Gui/Widgets/Editors/VolumeEditor.cs:47 #: src/Gui/Widgets/CategoryView.cs:61 msgid "Music" msgstr "Muusika" #: src/Gui/Widgets/Editors/VolumeEditor.cs:48 msgid "Audiobooks" msgstr "Audioraamatud" #: src/Gui/Widgets/Editors/VolumeEditor.cs:49 #: src/Gui/Widgets/CategoryView.cs:62 msgid "Movies" msgstr "Filmid" #: src/Gui/Widgets/Editors/VolumeEditor.cs:50 msgid "Videos" msgstr "Videod" #: src/Gui/Widgets/Editors/VolumeEditor.cs:51 msgid "Pictures" msgstr "Pildid" #: src/Gui/Widgets/Editors/VolumeEditor.cs:52 msgid "Games" msgstr "Mängud" #: src/Gui/Widgets/Editors/VolumeEditor.cs:53 src/Gui/Widgets/ItemInfo.cs:319 msgid "Software" msgstr "Tarkvara" #: src/Gui/Widgets/Editors/VolumeEditor.cs:54 msgid "Misc" msgstr "Mitmesugust" #: src/Gui/Widgets/Editors/VolumeEditor.cs:55 msgid "Other" msgstr "Muu" #: src/Gui/Widgets/Editors/VolumeEditor.cs:225 msgid "Yes" msgstr "Jah" #: src/Gui/Widgets/Editors/VolumeEditor.cs:225 msgid "No" msgstr "Ei" #: src/Gui/Widgets/Editors/VolumeEditor.cs:235 msgid "Volume type:" msgstr "Ketta tüüp:" #: src/Gui/Widgets/Editors/VolumeEditor.cs:236 msgid "Hashed:" msgstr "Kontrollsumma:" #: src/Gui/Widgets/Editors/VolumeEditor.cs:237 msgid "Added:" msgstr "Lisatud:" #: src/Gui/Widgets/Editors/VolumeEditor.cs:258 msgid "Archive No.:" msgstr "Arhiivi nr.:" #: src/Gui/Widgets/Editors/VolumeEditor.cs:260 msgid "Title:" msgstr "Pealkiri:" #: src/Gui/Widgets/Editors/VolumeEditor.cs:261 src/Gui/DBProperties.cs:98 msgid "Description:" msgstr "Kirjeldus:" #: src/Gui/Widgets/Editors/VolumeEditor.cs:262 msgid "Keywords:" msgstr "Märksõnad:" #: src/Gui/Widgets/Editors/VolumeEditor.cs:263 msgid "Loaned to:" msgstr "Kellele laenatud:" #: src/Gui/Widgets/Editors/VolumeEditor.cs:264 msgid "Loaned date:" msgstr "Laenamise aeg:" #: src/Gui/Widgets/Editors/VolumeEditor.cs:265 msgid "Return date:" msgstr "Tagastamise aeg:" #: src/Gui/Widgets/CategoryView.cs:58 msgid "Directories" msgstr "Kataloogid" #: src/Gui/Widgets/CategoryView.cs:59 msgid "Text" msgstr "Tekst" #: src/Gui/Widgets/CategoryView.cs:63 msgid "Images" msgstr "Pildid" #: src/Gui/Widgets/CategoryView.cs:64 msgid "Applications" msgstr "Rakendused" #: src/Gui/Widgets/CategoryView.cs:65 msgid "Archives" msgstr "Arhiivid" #: src/Gui/Widgets/CategoryView.cs:66 msgid "Development" msgstr "Arendus" #: src/Gui/Widgets/CategoryView.cs:96 src/Gui/MainWindow.cs:1046 msgid "Category" msgstr "Kategooria" #: src/Gui/Widgets/CategoryView.cs:128 msgid "All items" msgstr "Kõik kirjed" #: src/Gui/Widgets/SearchResultView.cs:32 msgid "Volume" msgstr "Köide" #: src/Gui/Widgets/SearchResultView.cs:33 src/Gui/MainWindow.cs:1040 msgid "Archive No." msgstr "Arhiivi nr." #: src/Gui/Widgets/ItemInfo.cs:40 msgid "by" msgstr "Kelle poolt" #: src/Gui/Widgets/ItemInfo.cs:41 msgid "from" msgstr "allikast" #: src/Gui/Widgets/ItemInfo.cs:196 msgid "Symlink target" msgstr "Nimeviida sihtmärk" #: src/Gui/Widgets/ItemInfo.cs:227 msgid "Track No." msgstr "Raja nr." #: src/Gui/Widgets/ItemInfo.cs:258 msgid "Genre" msgstr "Žanr" #: src/Gui/Widgets/ItemInfo.cs:278 msgid "Year" msgstr "Aasta" #: src/Gui/Widgets/ItemInfo.cs:283 msgid "Description" msgstr "Kirjeldus" #: src/Gui/Widgets/ItemInfo.cs:294 msgid "Dimensions" msgstr "Mõõtmed" #: src/Gui/Widgets/ItemInfo.cs:299 msgid "Format" msgstr "Vorming" #: src/Gui/Widgets/ItemInfo.cs:303 msgid "Author" msgstr "Autor" #: src/Gui/Widgets/ItemInfo.cs:307 msgid "Copyright" msgstr "Autoriõigused" #: src/Gui/Widgets/ItemInfo.cs:311 msgid "Producer" msgstr "Produtsent" #: src/Gui/Widgets/ItemInfo.cs:315 msgid "Creator" msgstr "Autor" #: src/Gui/Widgets/ItemInfo.cs:323 msgid "Language" msgstr "Keel" #: src/Gui/Widgets/ItemInfo.cs:327 msgid "Page count" msgstr "Lehtede arv" #: src/Gui/Widgets/ItemInfo.cs:346 msgid "File count" msgstr "Failide arv" #: src/Gui/Widgets/PageNavigation.cs:27 msgid "No items." msgstr "Pole kirjeid." #: src/Gui/Widgets/PageNavigation.cs:145 #, csharp-format msgid "Page {0}/{1} ({2} - {3} of {4} items)" msgstr "Leht {0}/{1} ({2} - {3} {4} kirjest)" #: src/Gui/ObjectProperties.cs:54 src/Gui/VolumeScanner.cs:248 msgid "Invalid data" msgstr "Vigased andmed" #: src/Gui/ObjectProperties.cs:54 src/Gui/VolumeScanner.cs:249 #, csharp-format msgid "" "\"{0}\" is {1}.\n" "\n" "Expected format: {2}\n" "Please correct or remove the data you entered." msgstr "" "\"{0}\" on {1}.\n" "\n" "Oodatud formaat: {2}\n" "Palun paranda või eemalda sisestatud andmed." #: src/Gui/DBProperties.cs:85 msgid "Database Properties" msgstr "Andmebaasi omadused" #: src/Gui/DBProperties.cs:97 msgid "Name:" msgstr "Nimi:" #: src/Gui/DBProperties.cs:99 msgid "Created:" msgstr "Loodud:" #: src/Gui/VolumeProperties.cs:29 msgid "Volume Properties" msgstr "Köite omadused" #: src/Gui/DriveSelection.cs:60 msgid "Waiting for drives..." msgstr "Ootan kettaid..." #: src/Gui/DriveSelection.cs:133 msgid "Drive" msgstr "Ketas" #: src/Gui/DriveSelection.cs:139 msgid "Label" msgstr "Silt" #: src/Gui/DriveSelection.cs:241 msgid "Please select a drive to scan" msgstr "Palun vali skaneerimiseks ketas" #: src/Gui/About.cs:28 msgid "A cross-platform media indexing/search tool." msgstr "" #: src/Gui/About.cs:29 #, csharp-format msgid "Using VolumeDB v{0}." msgstr "Kasutab VolumeDB v{0}." #: src/Gui/About.cs:31 msgid "Copyright (c) " msgstr "Autoriõigus (c) " #: src/Gui/ItemSearch.cs:81 #, csharp-format msgid "Found {0} items in {1:F3} seconds." msgstr "Leitud {0} kirje(t) {1:F3} sekundiga." #: src/Gui/ItemSearch.cs:92 src/Gui/MainWindow.cs:519 msgid "Timeout: another search is probably still in progress." msgstr "Aegumine: teine otsing on tõenäoliselt pooleli." #: src/Gui/ItemSearch.cs:94 msgid "Too many search results. Please refine your search criteria." msgstr "Liiga palju otsingutulemusi. Palun täpsusta otsingu parameetreid." #: src/Gui/ItemSearch.cs:112 src/Gui/MainWindow.cs:535 msgid "Searching..." msgstr "Otsimine..." #: src/Gui/ItemSearch.cs:267 msgid "Search Items" msgstr "Kirjete otsimine" #: src/Gui/ItemSearch.cs:279 src/Gui/MainWindow.cs:1145 msgid "default" msgstr "vaikimisi" #: src/Gui/ItemSearch.cs:283 msgid "Search items" msgstr "Otsi kirjeid" #: src/Gui/ItemSearch.cs:318 msgid "Quick tip:" msgstr "" #: src/Gui/ItemSearch.cs:319 #, csharp-format msgid "" "Click on the icon to the left of the search field to build advanced search " "queries.\n" "Example: {0}" msgstr "" #: src/Gui/ItemSearch.cs:326 msgid "No search results." msgstr "Otsingutulemusi pole." #: src/Gui/ItemSearch.cs:375 src/Gui/MainWindow.cs:1028 msgid "Edit Item" msgstr "Muuda kirjet" #: src/Gui/ItemSearch.cs:382 msgid "Show in Main Window" msgstr "" #: src/Gui/MainWindow.cs:77 src/Gui/MainWindow.cs:93 src/Gui/MainWindow.cs:635 #, csharp-format msgid "Database '{0}' not found." msgstr "Andmebaasi '{0}' ei leitud." #: src/Gui/MainWindow.cs:185 msgid "Database not found" msgstr "Andmebaasi ei leitud" #: src/Gui/MainWindow.cs:186 msgid "Default database not found. Create?" msgstr "Vaikimisi andmebaasi ei leitud. Loon uue?" #: src/Gui/MainWindow.cs:215 msgid "Unsupported database version" msgstr "Toetuseta andmebaasi versioon" #: src/Gui/MainWindow.cs:216 msgid "This database version is not supported." msgstr "Seda andmebaasi versiooni ei toetata." #: src/Gui/MainWindow.cs:235 #, csharp-format msgid "{0} volumes loaded." msgstr "{0} köidet laaditud." #: src/Gui/MainWindow.cs:256 #, csharp-format msgid "An error occured while loading the volume list: {0}" msgstr "Ketaste nimekirja laadimisel ilmnes viga:{0}" #: src/Gui/MainWindow.cs:300 msgid "Please enter the name for the new database" msgstr "Palun sisesta andmebaasile nimi" #: src/Gui/MainWindow.cs:312 msgid "Database exists" msgstr "Andmebaas eksisteerib" #: src/Gui/MainWindow.cs:313 msgid "Database already exists. Overwrite?" msgstr "Andmebaas on olemas. Kirjutan üle?" #: src/Gui/MainWindow.cs:326 msgid "Please select a database" msgstr "Palun vali andmebaas" #: src/Gui/MainWindow.cs:335 src/Gui/Import.cs:83 msgid "Database not found." msgstr "Andmebaasi ei leitud." #: src/Gui/MainWindow.cs:356 #, csharp-format msgid "" "An error occured while accessing drive {0}:\n" "{1}" msgstr "" "Ketta avamisel ilmnes viga {0}:\n" "{1}" #: src/Gui/MainWindow.cs:378 #, csharp-format msgid "Drive {0} is not ready." msgstr "Ketas {0}pole valmis." #: src/Gui/MainWindow.cs:387 #, csharp-format msgid "Drive {0} is neither mounted nor does it contain an audio cd." msgstr "Ketas {0} pole ühendatud ega sisalda audio cd-d." #: src/Gui/MainWindow.cs:406 msgid "Confirmation" msgstr "Kinnitus" #: src/Gui/MainWindow.cs:407 msgid "Are you sure you really want to remove the selected volume?" msgstr "Oled kindel, et soovid valitud ketta kustutada?" #: src/Gui/MainWindow.cs:712 #, csharp-format msgid "Please insert volume '{0}'." msgstr "" #: src/Gui/MainWindow.cs:714 msgid "Waiting for volume" msgstr "" #: src/Gui/MainWindow.cs:966 msgid "Add Volume" msgstr "" #: src/Gui/MainWindow.cs:970 msgid "Search" msgstr "" #: src/Gui/MainWindow.cs:973 msgid "App Menu" msgstr "" #: src/Gui/MainWindow.cs:979 msgid "_New Database" msgstr "_Uus andmebaas" #: src/Gui/MainWindow.cs:982 msgid "_Open Database" msgstr "_Ava andmebaas" #: src/Gui/MainWindow.cs:985 msgid "Open Default Database" msgstr "Ava vaikimisi andmebaas" #: src/Gui/MainWindow.cs:991 msgid "Recent Databases" msgstr "Hiljutised andmebaasid" #: src/Gui/MainWindow.cs:998 msgid "_Import" msgstr "_Impordi" #: src/Gui/MainWindow.cs:1001 msgid "_Preferences" msgstr "_Eelistused" #: src/Gui/MainWindow.cs:1004 msgid "_Database Properties" msgstr "An_dmebaasi omadused" #: src/Gui/MainWindow.cs:1007 msgid "Info" msgstr "" #: src/Gui/MainWindow.cs:1010 msgid "_Quit" msgstr "_Välju" #: src/Gui/MainWindow.cs:1016 msgid "_Edit Volume" msgstr "_Muuda ketas" #: src/Gui/MainWindow.cs:1019 msgid "_Remove Volume" msgstr "Eemal_da ketas" #: src/Gui/MainWindow.cs:1022 msgid "Rescan Volume" msgstr "" #: src/Gui/MainWindow.cs:1034 msgid "Sort by" msgstr "Järjesta" #: src/Gui/MainWindow.cs:1037 msgid "Descending" msgstr "Kahanevas järjestuses" #: src/Gui/MainWindow.cs:1043 msgid "Date added" msgstr "Lisamise kuupäev" #: src/Gui/MainWindow.cs:1044 msgid "Title" msgstr "Pealkiri" #: src/Gui/MainWindow.cs:1045 msgid "Drivetype" msgstr "Ketta tüüp" #: src/Gui/MainWindow.cs:1142 msgid "Filter volumes" msgstr "Filtreeri kettaid" #: src/Gui/Import.cs:29 msgid "Import" msgstr "Impordi" #: src/Gui/Import.cs:30 msgid "Abort" msgstr "Katkesta" #: src/Gui/Import.cs:31 msgid "Please select a database." msgstr "" #: src/Gui/Import.cs:72 #, csharp-format msgid "{0:0}% completed." msgstr "{0:0}% valmis." #: src/Gui/Import.cs:82 msgid "Import failed" msgstr "Tõrge importimisel" #: src/Gui/Import.cs:85 msgid "Import failed!" msgstr "Importimine nurjus!" #: src/Gui/Import.cs:87 msgid "Import aborted." msgstr "Importimine katkestatud." #: src/Gui/Import.cs:89 msgid "Import completed successfully." msgstr "Importimine lõppes edukalt." #: src/Gui/Import.cs:121 msgid "Import in progress" msgstr "Importimine käib" #: src/Gui/Import.cs:122 msgid "You must stop the import before closing this window." msgstr "Enne selle akna sulgemist pead sa importimise lõpetama." #: src/Gui/Import.cs:148 msgid "Unknown format." msgstr "" #: src/Gui/Import.cs:175 msgid "Import Database" msgstr "Impordi andmebaas" #: src/Gui/Import.cs:186 msgid "Please select a database to import" msgstr "Palun vali importimiseks andmebaas" #: src/Gui/Import.cs:194 msgid "All supported formats" msgstr "" #: src/Gui/Import.cs:198 #, csharp-format msgid ".{0} files" msgstr "" #: src/Gui/Import.cs:209 msgid "Database:" msgstr "Andmebaas:" #: src/Gui/Import.cs:210 msgid "Format:" msgstr "Vorming:" #: src/Gui/ItemProperties.cs:29 msgid "Item Properties" msgstr "Kirje omadused" #: src/Gui/VolumeScanner.cs:116 msgid "Scanning started." msgstr "Skaneerimine käivitatud." #: src/Gui/VolumeScanner.cs:118 #, csharp-format msgid "Scanning of drive '{0}' started." msgstr "Ketta {0} skaneerimine käivitatud." #: src/Gui/VolumeScanner.cs:124 #, csharp-format msgid "" "Options: generate thumbs: {0}, extract metadata: {1}, discard symlinks: {2}, " "hashing: {3}." msgstr "" "Valikud: loo pisipildid: {0}, kuva metaandmeid: {1}, loobu nimeviitadest: " "{2}, kontrollsumma: {3}." #: src/Gui/VolumeScanner.cs:131 #, csharp-format msgid "Options: MusicBrainz enabled: {0}" msgstr "Valik: MusicBrainZ aktiveeritud: {0}" #: src/Gui/VolumeScanner.cs:157 msgid "Time" msgstr "Aeg" #: src/Gui/VolumeScanner.cs:161 msgid "Message" msgstr "Teade" #: src/Gui/VolumeScanner.cs:258 msgid "Stopping Scanner and performing rollback..." msgstr "Skaneerimine peatatakse ja taastatake algne olek..." #: src/Gui/VolumeScanner.cs:268 msgid "yes" msgstr "jah" #: src/Gui/VolumeScanner.cs:268 msgid "no" msgstr "ei" #: src/Gui/VolumeScanner.cs:291 msgid "Scan in progress" msgstr "Skaneerimine töötab" #: src/Gui/VolumeScanner.cs:291 msgid "You must stop scanning before closing this window." msgstr "Enne selle akna sulgemist peate skaneerimise lõpetama." #: src/Gui/VolumeScanner.cs:346 #, csharp-format msgid "An unhandled exception occured ({0})." msgstr "Ilmnes käsitlematu olukord ({0})." #: src/Gui/VolumeScanner.cs:347 msgid "All database changes have been rolled back." msgstr "Kõik andmebaasi muudatused on tagasi pööratud." #: src/Gui/VolumeScanner.cs:354 #, csharp-format msgid "Scanning failed. Reason: an unhandled exception occured ({0})." msgstr "Skaneerimine nurjus. Põhjus: Ilmnes käsitlematu olukord {0}." #: src/Gui/VolumeScanner.cs:356 msgid "Scanning aborted." msgstr "Skaneerimine tühistatud." #: src/Gui/VolumeScanner.cs:358 msgid "Scanning completed successfully." msgstr "Skanerimine lõpetatud edukalt." #: src/Gui/VolumeScanner.cs:488 msgid "VolumeScanner" msgstr "Kettaskanner" #: src/Gui/VolumeScanner.cs:500 msgid "Volume Information:" msgstr "Ketta informatsioon:" #: src/Gui/VolumeScanner.cs:510 msgid "Scanner Log:" msgstr "Skanneri logi:" #: src/Gui/VolumeScanner.cs:527 msgid "Database access" msgstr "Andmebaasi juurdepääs" #: src/Gui/Preferences.cs:119 msgid "None" msgstr "Puudub" #: src/Gui/Preferences.cs:228 msgid "Unsupported theme" msgstr "Sobimatu teema" #: src/Gui/Preferences.cs:229 msgid "The selected icon theme is currently not supported on your system." msgstr "Valitud ikooniteema ei ole hetkel teie süsteemis toetatud." #: src/Gui/Preferences.cs:267 msgid "Restart required" msgstr "Vajalik taaskäivitus" #: src/Gui/Preferences.cs:268 #, csharp-format msgid "You must restart {0} for icontheme changes to take effect." msgstr "Te peate taaskäivitama {0} , et ikooniteema muudatused rakenduksid." #: src/Gui/Preferences.cs:298 msgid "Preferences" msgstr "Eelistused" #: src/Gui/Preferences.cs:322 msgid "_Load Defaults" msgstr "_Lae vaikeseaded" #: src/Gui/Preferences.cs:349 msgid "Icon theme:" msgstr "Ikooniteema:" #: src/Gui/Preferences.cs:355 msgid "Reopen most recent database on startup" msgstr "Käivitusel taasava kõige hilisem andmebaas" #: src/Gui/Preferences.cs:359 msgid "Show iteminfo panel" msgstr "Näita kirjete infopaneeli" #: src/Gui/Preferences.cs:363 msgid "Show hidden files" msgstr "Näita peidetud faile" #: src/Gui/Preferences.cs:367 msgid "Show thumbnails in the filebrowser" msgstr "Näita pisipilte failisirvija paneelil" #: src/Gui/Preferences.cs:370 msgid "General" msgstr "Üldine" #: src/Gui/Preferences.cs:378 msgid "Don't prompt, always scan:" msgstr "Ära küsi, alati skanni:" #: src/Gui/Preferences.cs:397 msgid "Generate Thumbnails" msgstr "Loo pisipildid" #: src/Gui/Preferences.cs:401 msgid "Extract metadata" msgstr "Eralda metaandmed (nt ID3, EXIF jne)" #: src/Gui/Preferences.cs:405 msgid "Discard symbolic links" msgstr "Eira nimeviitasid" #: src/Gui/Preferences.cs:409 msgid "Compute hashcodes for files (slow!)" msgstr "Arvuta failide kontrollsummad (aeglane!)" #: src/Gui/Preferences.cs:413 msgid "Fetch audio cd metadata from MusicBrainz.org" msgstr "Tõmba audio cd metaandmeid MusicBrainz.org-st." #: src/Gui/Preferences.cs:416 msgid "Scanner" msgstr "Skanner" Basenji/po/hu.resources0000664000175000017500000003342512067326706015315 0ustar patrickpatricklSystem.Resources.ResourceReader, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089#System.Resources.RuntimeResourceSetPADPADP̯[\ĒZFn_`/+ܽێyB_2 bJ䗖x~?ޘ ǚ˚}朮G  +Iљ,ޠ}ѬX`pѨE7kݏѝ!峸/# *?8 ڻMo;,锼xb5x,Qoĵgsv59}΍\$о DaрO51 թ}&ٍɬڴn^/gk䷧p$dF>?y7 Taq;͈nYDoY`rYrY$sYsYStYj~Ԕx06Z P4 * J  o> 8a c iz $ |q c O\mga}AKuQ>R j!ز$&P%%*U++1;v9`9vE:Iu:>Y@;CBsDH1L2Q;RfMSMeS@STXmޡY![[Page {0}/{1}</b> ({2} - {3} of {4} items)&<b>Scanner Log:</b>D4<b>Volume Information:</b>` Abort} Added:VAll database changes have been rolled back.All filesAll items^An error occured while accessing drive {0}: {1}fAn error occured while loading the volume list: {0})JAn unhandled exception occured ({0}).[Applications|Archive No.Archive No.:ArchivesvAre you sure you really want to remove the selected volume? ArtistAudio CDAudio CD trackAudiobooks Author% Backup. BytesCCategoryJCategory:VFCompute hashcodes for files (slow!)cConfirmationCopyrightCopyright (c) Created:Creator2Database '{0}' not found.&Database PropertiesDatabase access5FDatabase already exists. Overwrite?JDatabase existsv$Database not found&Database not found.Database:Date addedFDefault database not found. Create?Descending3Description?Description:IDevelopmentTDimensionsaDirectorieskDirectories:yDirectory,Discard symbolic linksDocuments4Don't prompt, always scan: DrivezDrive {0} is neither mounted nor does it contain an audio cd..Drive {0} is not ready.Drivetype@DurationPDuration:WEdit Item_ Errors Extract metadatayXFetch audio cd metadata from MusicBrainz.orgFileFile count Files:FilesystemFiletypeFilter volumes FormatFormat:&DFound {0} items in {1:F3} seconds.2GBe GamesiGeneralt&Generate Thumbnails GenreHashHashed:Icon theme: Images ImportImport DatabaseImport aborted. MessageB MiscK MoviesY Musica Nameg Name:m Not No items.y $No search results. None Note *Open Default Database BOptions: MusicBrainz enabled: {0} Options: generate thumbs: {0}, extract metadata: {1}, discard symlinks: {2}, hashing: {3}. Other Page count Pictures TPlease enter the name for the new database 0Please select a database DPlease select a database to import :Please select a drive to scan? Preferencesm Producer} Recent Databases LReopen most recent database on startup Restart required Return date: Scan in progress$ Scanner@ "Scanning aborted.I @Scanning completed successfully.g |Scanning failed. Reason: an unhandled exception occured ({0}). @Scanning of drive '{0}' started. "Scanning started.Search Items,Search items>Searching...PDShow thumbnails in the filebrowser]SizeSoftwareSort byVStopping Scanner and performing rollback...Symlink targetTBTextThe selected icon theme is currently not supported on your system.NThis database version is not supported.OTimeylTimeout: another search is probably still in progress. Title Title:xToo many search results. Please refine your search criteria.Total size:Track No.&Tracks:-Type7Unknown?UnnamedK8Unsupported database versionV"Unsupported themez(Using VolumeDB v{0}. Videos Volume"Volume PropertiesVolume type:(VolumeDatabase filesVolumeScanner*Waiting for drives...Year3Yes8tYou must restart {0} for icontheme changes to take effect.>dYou must stop scanning before closing this window.hYou must stop the import before closing this window.(_Database Properties,_Edit VolumeH_Import__Load Defaultsn_New Database_Open Database_Preferences _Quit_Remove Volumebydefault files fromno tracksyes("{0:0}% completed..{0} Bytes<.{0} is already running.G&{0} volumes loaded.VProject-Id-Version: basenji Report-Msgid-Bugs-To: FULL NAME POT-Creation-Date: 2012-07-15 15:49+0200 PO-Revision-Date: 2010-08-17 20:28+0000 Last-Translator: Patrick Ulbrich Language-Team: Hungarian MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Launchpad-Export-Date: 2012-10-27 11:00+0000 X-Generator: Launchpad (build 16194) oA "{0} a következő: {1}. A kívánt formátum pedig: {2} Korrigálja, vagy távolítsa el a helytelen adatot.(üres)*Lap {0}/{1} ({2} - {3} / {4} elem)Átvizsgálás log:Kötet információ: Megszakít Hozzáadva:8Az adatbázis változások visszaállításra kerültek. Minden fájl Minden elem?q;͈nYDoY`rYrY$sYsYStYj~Ԕ6Z P4 * J  o> c iz $ |q c ga}AQ>R j!ز$&P%U++1`9Iu:>;CBsD1L2Q;RfMSMeS@STX![_㦍afZgahj=mj[l먗mpKtxUuxjv1v;n|q|؂|}$|xT|e|)|*#| u  Q E v0 P   j > J  0 3s\  1; kw|}<  h ]~ - ,nVm>P "C  [E (Ji0 Q/E gV P(empty)Z<b>Page {0}/{1}</b> ({2} - {3} of {4} items)&<b>Scanner Log:</b>4<b>Volume Information:</b> AbortS Added:iVAll database changes have been rolled back.|All filesAll itemsfAn error occured while loading the volume list: {0}JAn unhandled exception occured ({0}).[ApplicationsArchive No.Archive No.:Archives Artist Author Backup Bytes&Category2Category:FConfirmation[CopyrightuCopyright (c) Created:2Database '{0}' not found.&Database PropertiesDatabase access*Database existsQ$Database not found&Database not found.Database:FDefault database not found. Create?DescriptionqDescription:DimensionsDirectoriesDirectories:Documents DriveDurationDuration:  Error* Extract metadata8File countd Files:}FilesystemFiletype FormatFormat:DFound {0} items in {1:F3} seconds.GBGeneral% Genre/ Images9 ImportQImport DatabaseiImport aborted. POT-Creation-Date: 2012-07-15 15:49+0200 PO-Revision-Date: 2010-04-25 11:22+0000 Last-Translator: svilborg Language-Team: Bulgarian MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Launchpad-Export-Date: 2012-10-27 11:00+0000 X-Generator: Launchpad (build 16194) (празно)BСтраница {0}/{1} ({2} - {3} от {4} записа).Дневник на сканиране:6Информация за устройство:ПрекъсванеДобавено:MВсички промени в базата данни са отменени.Всички файловеВички записиXГрешка при зареждане на списъка с устройства : {0}4Необработено изключение ({0}).ПриложенияНомер на архивНомер на архив: АрхивиИзпълнител АвторАрхивиране БайтаКатегорияКатегория:ПотвърждениеАвторски праваАвторско право Създаден на:1База данни '{0}' не е открита.-Настойки на базата данни%Достъп до база данни-Базата данни съществува./Базата данни не е открита.1Базата данни не е намерена.База данни:uБазата данни по подразбиране не е открита. Да бъде ли създадена ?ОписаниеОписание:Размери Папки Папки:ДокументиУстройствоПродължителностПродължителност: Грешка*Извличане на метаданниБрой файловеФайлове:Файлова системаТип файл Формат Формат:BНамерени са {0} записа за {1:F3} секунди.ГБОбщиЖанрИзображенияИмпортиране3Импортиране на базата данни3Импортирането е прекъснато.@Импортирането е успешно завършено.0Импортирането е неуспешно1Импортирането е неуспешно!+В Процес на импортиранеНевалидни данниКБКлючови думи: ЕтикетЕзик+Време на последен записЗареждане…Дата на заемане:Заето от:МестоположениеМБСъобщение Разни Филми МузикаИмеИме:НеНяма записи.4Няма резултати от търсенето. ДругиБрой странициИлюстрацииGМоля, въведете име на новата база данни.Моля, изберете база данниIМоля изберете база данни за импортиранеПредпочитанияПродуцент,Изисква се рестартиранеДата на връщане:(В процес на сканиране. Скенер0Сканирането е прекратено.<Сканирането е успешно завършено.lГрешка при сканиране. Причина: необработено изключение ({0}).'Сканиране на диск '{0}'./Сканирането е стартирано.Търсене... РазмерСофтуерТБ Текст ВремеЗаглавие:{Твърде много резултати от търсенето. Моля, уточнете Вашето търсене.Общ размер:Номер на песен Песни:ТипНеизвестно Без име$Използва се VolumeDB v{0}.&Скенер на устройства ГодинаДаoТрябва да прекратите сканирането, за да затворите прозореца.jТрябва да спрете импортирането за да затворите прозореца._Импортиране_Предпочитания_Затварянеот файлаотне записида{0} Байта*{0} заредени устройства.Basenji/po/it.po0000664000175000017500000005162612067326706013724 0ustar patrickpatrick# Italian translation for basenji # Copyright (c) 2009 Rosetta Contributors and Canonical Ltd 2009 # This file is distributed under the same license as the basenji package. # FIRST AUTHOR , 2009. # msgid "" msgstr "" "Project-Id-Version: basenji\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2012-07-15 15:49+0200\n" "PO-Revision-Date: 2011-11-13 17:34+0000\n" "Last-Translator: Fidel Nadera \n" "Language-Team: Italian \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2012-10-27 11:00+0000\n" "X-Generator: Launchpad (build 16194)\n" #: src/Util.cs:30 #, csharp-format msgid "{0} Bytes" msgstr "{0} byte" #: src/Util.cs:32 msgid "Bytes" msgstr "byte" #: src/Util.cs:32 msgid "KB" msgstr "kB" #: src/Util.cs:32 msgid "MB" msgstr "MB" #: src/Util.cs:32 msgid "GB" msgstr "GB" #: src/Util.cs:32 msgid "TB" msgstr "TB" #: src/Options.cs:477 msgid "OptionName" msgstr "NomeOpzione" #: src/FileDialog.cs:51 msgid "VolumeDatabase files" msgstr "File VolumeDatabase" #: src/FileDialog.cs:56 msgid "All files" msgstr "Tutti i file" #: src/Main.cs:142 src/Gui/MainWindow.cs:76 src/Gui/MainWindow.cs:92 #: src/Gui/MainWindow.cs:334 src/Gui/MainWindow.cs:355 #: src/Gui/MainWindow.cs:377 src/Gui/MainWindow.cs:386 #: src/Gui/MainWindow.cs:635 msgid "Error" msgstr "Errore" #: src/Main.cs:142 #, csharp-format msgid "{0} is already running." msgstr "{0} è in esecuzione." #: src/Gui/Widgets/VolumeView.cs:42 src/Gui/Widgets/SearchResultView.cs:30 msgid "Unnamed" msgstr "Senza nome" #: src/Gui/Widgets/VolumeView.cs:43 #: src/Gui/Widgets/Editors/VolumeEditor.cs:259 msgid "Category:" msgstr "Categoria:" #: src/Gui/Widgets/VolumeView.cs:44 msgid "files" msgstr "file" #: src/Gui/Widgets/VolumeView.cs:45 msgid "tracks" msgstr "tracce" #: src/Gui/Widgets/ItemView.cs:29 msgid "Loading..." msgstr "Caricamento..." #: src/Gui/Widgets/ItemView.cs:30 msgid "(empty)" msgstr "(vuoto)" #: src/Gui/Widgets/ItemView.cs:99 src/Gui/DriveSelection.cs:80 msgid "Unknown" msgstr "Sconosciuto" #: src/Gui/Widgets/ItemView.cs:170 src/Gui/Widgets/Editors/ItemEditor.cs:96 msgid "Name" msgstr "Nome" #: src/Gui/Widgets/ItemView.cs:176 msgid "Artist" msgstr "Artista" #: src/Gui/Widgets/ItemView.cs:181 #: src/Gui/Widgets/Editors/AudioTrackItemEditor.cs:53 #: src/Gui/Widgets/ItemInfo.cs:225 src/Gui/Widgets/ItemInfo.cs:288 msgid "Duration" msgstr "Durata" #: src/Gui/Widgets/Editors/FileSystemVolumeEditor.cs:34 #: src/Gui/DriveSelection.cs:168 msgid "Filesystem" msgstr "File system" #: src/Gui/Widgets/Editors/FileSystemVolumeEditor.cs:65 msgid "Files:" msgstr "File:" #: src/Gui/Widgets/Editors/FileSystemVolumeEditor.cs:66 msgid "Directories:" msgstr "Cartelle:" #: src/Gui/Widgets/Editors/FileSystemVolumeEditor.cs:67 msgid "Total size:" msgstr "Dimensione totale:" #: src/Gui/Widgets/Editors/ItemEditor.cs:95 msgid "Item type" msgstr "Tipo elemento" #: src/Gui/Widgets/Editors/ItemEditor.cs:111 src/Gui/Widgets/ItemInfo.cs:371 msgid "Note" msgstr "Annotazioni" #: src/Gui/Widgets/Editors/ItemEditor.cs:112 src/Gui/Widgets/ItemInfo.cs:374 msgid "Keywords" msgstr "Parole chiave" #: src/Gui/Widgets/Editors/AudioTrackItemEditor.cs:31 #: src/Gui/Widgets/SearchResultView.cs:34 msgid "Audio CD track" msgstr "Traccia CD audio" #: src/Gui/Widgets/Editors/AudioTrackItemEditor.cs:54 #: src/Gui/Widgets/ItemInfo.cs:230 msgid "Type" msgstr "Tipo" #: src/Gui/Widgets/Editors/DirectoryItemEditor.cs:28 msgid "Directory" msgstr "Cartella" #: src/Gui/Widgets/Editors/FileSystemItemEditor.cs:59 #: src/Gui/Widgets/SearchResultView.cs:31 src/Gui/Widgets/ItemInfo.cs:183 msgid "Location" msgstr "Posizione" #: src/Gui/Widgets/Editors/FileSystemItemEditor.cs:60 #: src/Gui/Widgets/ItemInfo.cs:185 msgid "Last write time" msgstr "Ultima scrittura" #: src/Gui/Widgets/Editors/FileSystemItemEditor.cs:61 #: src/Gui/Widgets/ItemInfo.cs:210 msgid "Filetype" msgstr "Tipo di file" #: src/Gui/Widgets/Editors/FileItemEditor.cs:31 msgid "File" msgstr "File" #: src/Gui/Widgets/Editors/FileItemEditor.cs:52 #: src/Gui/Widgets/ItemInfo.cs:204 src/Gui/Widgets/ItemInfo.cs:226 #: src/Gui/DriveSelection.cs:148 msgid "Size" msgstr "Dimensioni" #: src/Gui/Widgets/Editors/FileItemEditor.cs:53 #: src/Gui/Widgets/ItemInfo.cs:206 msgid "Hash" msgstr "Hash" #: src/Gui/Widgets/Editors/AudioCdVolumeEditor.cs:33 msgid "Audio CD" msgstr "CD audio" #: src/Gui/Widgets/Editors/AudioCdVolumeEditor.cs:63 msgid "Tracks:" msgstr "Brani:" #: src/Gui/Widgets/Editors/AudioCdVolumeEditor.cs:64 msgid "Duration:" msgstr "Durata:" #: src/Gui/Widgets/Editors/VolumeEditor.cs:45 msgid "Backup" msgstr "Backup" #: src/Gui/Widgets/Editors/VolumeEditor.cs:46 #: src/Gui/Widgets/CategoryView.cs:60 msgid "Documents" msgstr "Documenti" #: src/Gui/Widgets/Editors/VolumeEditor.cs:47 #: src/Gui/Widgets/CategoryView.cs:61 msgid "Music" msgstr "Musica" #: src/Gui/Widgets/Editors/VolumeEditor.cs:48 msgid "Audiobooks" msgstr "Audiolibri" #: src/Gui/Widgets/Editors/VolumeEditor.cs:49 #: src/Gui/Widgets/CategoryView.cs:62 msgid "Movies" msgstr "Filmati" #: src/Gui/Widgets/Editors/VolumeEditor.cs:50 msgid "Videos" msgstr "Video" #: src/Gui/Widgets/Editors/VolumeEditor.cs:51 msgid "Pictures" msgstr "Immagini" #: src/Gui/Widgets/Editors/VolumeEditor.cs:52 msgid "Games" msgstr "Giochi" #: src/Gui/Widgets/Editors/VolumeEditor.cs:53 src/Gui/Widgets/ItemInfo.cs:319 msgid "Software" msgstr "Software" #: src/Gui/Widgets/Editors/VolumeEditor.cs:54 msgid "Misc" msgstr "Varie" #: src/Gui/Widgets/Editors/VolumeEditor.cs:55 msgid "Other" msgstr "Altro" #: src/Gui/Widgets/Editors/VolumeEditor.cs:225 msgid "Yes" msgstr "Sì" #: src/Gui/Widgets/Editors/VolumeEditor.cs:225 msgid "No" msgstr "No" #: src/Gui/Widgets/Editors/VolumeEditor.cs:235 msgid "Volume type:" msgstr "Tipo di volume:" #: src/Gui/Widgets/Editors/VolumeEditor.cs:236 msgid "Hashed:" msgstr "Hash:" #: src/Gui/Widgets/Editors/VolumeEditor.cs:237 msgid "Added:" msgstr "Aggiunto:" #: src/Gui/Widgets/Editors/VolumeEditor.cs:258 msgid "Archive No.:" msgstr "Archive:" #: src/Gui/Widgets/Editors/VolumeEditor.cs:260 msgid "Title:" msgstr "Titolo:" #: src/Gui/Widgets/Editors/VolumeEditor.cs:261 src/Gui/DBProperties.cs:98 msgid "Description:" msgstr "Descrizione:" #: src/Gui/Widgets/Editors/VolumeEditor.cs:262 msgid "Keywords:" msgstr "Parole chiave:" #: src/Gui/Widgets/Editors/VolumeEditor.cs:263 msgid "Loaned to:" msgstr "Prestato a:" #: src/Gui/Widgets/Editors/VolumeEditor.cs:264 msgid "Loaned date:" msgstr "Data prestito:" #: src/Gui/Widgets/Editors/VolumeEditor.cs:265 msgid "Return date:" msgstr "Data di ritorno:" #: src/Gui/Widgets/CategoryView.cs:58 msgid "Directories" msgstr "Cartelle" #: src/Gui/Widgets/CategoryView.cs:59 msgid "Text" msgstr "Testo" #: src/Gui/Widgets/CategoryView.cs:63 msgid "Images" msgstr "Immagini" #: src/Gui/Widgets/CategoryView.cs:64 msgid "Applications" msgstr "Applicazioni" #: src/Gui/Widgets/CategoryView.cs:65 msgid "Archives" msgstr "Archivi" #: src/Gui/Widgets/CategoryView.cs:66 msgid "Development" msgstr "Programmazione" #: src/Gui/Widgets/CategoryView.cs:96 src/Gui/MainWindow.cs:1046 msgid "Category" msgstr "Categoria" #: src/Gui/Widgets/CategoryView.cs:128 msgid "All items" msgstr "Tutti gli elementi" #: src/Gui/Widgets/SearchResultView.cs:32 msgid "Volume" msgstr "Volume" #: src/Gui/Widgets/SearchResultView.cs:33 src/Gui/MainWindow.cs:1040 msgid "Archive No." msgstr "Archivio" #: src/Gui/Widgets/ItemInfo.cs:40 msgid "by" msgstr "di" #: src/Gui/Widgets/ItemInfo.cs:41 msgid "from" msgstr "da" #: src/Gui/Widgets/ItemInfo.cs:196 msgid "Symlink target" msgstr "Destinazione del collegamento" #: src/Gui/Widgets/ItemInfo.cs:227 msgid "Track No." msgstr "Traccia Num." #: src/Gui/Widgets/ItemInfo.cs:258 msgid "Genre" msgstr "Genere" #: src/Gui/Widgets/ItemInfo.cs:278 msgid "Year" msgstr "Anno" #: src/Gui/Widgets/ItemInfo.cs:283 msgid "Description" msgstr "Descrizione" #: src/Gui/Widgets/ItemInfo.cs:294 msgid "Dimensions" msgstr "Dimensioni" #: src/Gui/Widgets/ItemInfo.cs:299 msgid "Format" msgstr "Formato" #: src/Gui/Widgets/ItemInfo.cs:303 msgid "Author" msgstr "Autore" #: src/Gui/Widgets/ItemInfo.cs:307 msgid "Copyright" msgstr "Copyright" #: src/Gui/Widgets/ItemInfo.cs:311 msgid "Producer" msgstr "Produttore" #: src/Gui/Widgets/ItemInfo.cs:315 msgid "Creator" msgstr "Autore" #: src/Gui/Widgets/ItemInfo.cs:323 msgid "Language" msgstr "Lingua" #: src/Gui/Widgets/ItemInfo.cs:327 msgid "Page count" msgstr "Conteggio pagine" #: src/Gui/Widgets/ItemInfo.cs:346 msgid "File count" msgstr "Conteggio file" #: src/Gui/Widgets/PageNavigation.cs:27 msgid "No items." msgstr "Nessun elemento." #: src/Gui/Widgets/PageNavigation.cs:145 #, csharp-format msgid "Page {0}/{1} ({2} - {3} of {4} items)" msgstr "Pagina {0}/{1} ({2} - {3} di {4} elementi)" #: src/Gui/ObjectProperties.cs:54 src/Gui/VolumeScanner.cs:248 msgid "Invalid data" msgstr "Dati non validi" #: src/Gui/ObjectProperties.cs:54 src/Gui/VolumeScanner.cs:249 #, csharp-format msgid "" "\"{0}\" is {1}.\n" "\n" "Expected format: {2}\n" "Please correct or remove the data you entered." msgstr "" "\"{0}\" è {1}.\n" "\n" "Formato atteso: {2}\n" "Correggere o rimuovere i dati inseriti." #: src/Gui/DBProperties.cs:85 msgid "Database Properties" msgstr "Proprietà del database" #: src/Gui/DBProperties.cs:97 msgid "Name:" msgstr "Nome:" #: src/Gui/DBProperties.cs:99 msgid "Created:" msgstr "Creato:" #: src/Gui/VolumeProperties.cs:29 msgid "Volume Properties" msgstr "Proprietà del volume" #: src/Gui/DriveSelection.cs:60 msgid "Waiting for drives..." msgstr "In attesa dei dispositivi..." #: src/Gui/DriveSelection.cs:133 msgid "Drive" msgstr "Dispositivo" #: src/Gui/DriveSelection.cs:139 msgid "Label" msgstr "Etichetta" #: src/Gui/DriveSelection.cs:241 msgid "Please select a drive to scan" msgstr "Selezionare un dispositivo da scansionare" #: src/Gui/About.cs:28 msgid "A cross-platform media indexing/search tool." msgstr "Indicizzazione della piattaforme-incrociate/strumento di ricerca" #: src/Gui/About.cs:29 #, csharp-format msgid "Using VolumeDB v{0}." msgstr "Utilizza VolumeDB v{0}." #: src/Gui/About.cs:31 msgid "Copyright (c) " msgstr "Copyright (c) " #: src/Gui/ItemSearch.cs:81 #, csharp-format msgid "Found {0} items in {1:F3} seconds." msgstr "Trovati {0} elementi in {1:F3} secondi." #: src/Gui/ItemSearch.cs:92 src/Gui/MainWindow.cs:519 msgid "Timeout: another search is probably still in progress." msgstr "Timeout: un'altra ricerca potrebbe essere in corso." #: src/Gui/ItemSearch.cs:94 msgid "Too many search results. Please refine your search criteria." msgstr "Troppi risultati di ricerca. Affinare i criteri di ricerca." #: src/Gui/ItemSearch.cs:112 src/Gui/MainWindow.cs:535 msgid "Searching..." msgstr "Ricerca in corso..." #: src/Gui/ItemSearch.cs:267 msgid "Search Items" msgstr "Cerca elementi" #: src/Gui/ItemSearch.cs:279 src/Gui/MainWindow.cs:1145 msgid "default" msgstr "predefinito" #: src/Gui/ItemSearch.cs:283 msgid "Search items" msgstr "Cerca oggetti" #: src/Gui/ItemSearch.cs:318 msgid "Quick tip:" msgstr "" #: src/Gui/ItemSearch.cs:319 #, csharp-format msgid "" "Click on the icon to the left of the search field to build advanced search " "queries.\n" "Example: {0}" msgstr "" #: src/Gui/ItemSearch.cs:326 msgid "No search results." msgstr "Nessun risultato." #: src/Gui/ItemSearch.cs:375 src/Gui/MainWindow.cs:1028 msgid "Edit Item" msgstr "Modifica elemento" #: src/Gui/ItemSearch.cs:382 msgid "Show in Main Window" msgstr "" #: src/Gui/MainWindow.cs:77 src/Gui/MainWindow.cs:93 src/Gui/MainWindow.cs:635 #, csharp-format msgid "Database '{0}' not found." msgstr "Database '{0}' non trovato." #: src/Gui/MainWindow.cs:185 msgid "Database not found" msgstr "Database non trovato" #: src/Gui/MainWindow.cs:186 msgid "Default database not found. Create?" msgstr "Database predefinito non trovato. Crearlo?" #: src/Gui/MainWindow.cs:215 msgid "Unsupported database version" msgstr "Versione del database non supportata" #: src/Gui/MainWindow.cs:216 msgid "This database version is not supported." msgstr "Questa versione del database non è supportata" #: src/Gui/MainWindow.cs:235 #, csharp-format msgid "{0} volumes loaded." msgstr "{0} volumi caricati." #: src/Gui/MainWindow.cs:256 #, csharp-format msgid "An error occured while loading the volume list: {0}" msgstr "" "Si è verificato un errore durante il caricamento della lista dei volumi: {0}" #: src/Gui/MainWindow.cs:300 msgid "Please enter the name for the new database" msgstr "Inserire il nome del nuovo database" #: src/Gui/MainWindow.cs:312 msgid "Database exists" msgstr "Database esistente" #: src/Gui/MainWindow.cs:313 msgid "Database already exists. Overwrite?" msgstr "Database esistente. Sovrascrivere?" #: src/Gui/MainWindow.cs:326 msgid "Please select a database" msgstr "Selezionare un database" #: src/Gui/MainWindow.cs:335 src/Gui/Import.cs:83 msgid "Database not found." msgstr "Database non trovato" #: src/Gui/MainWindow.cs:356 #, csharp-format msgid "" "An error occured while accessing drive {0}:\n" "{1}" msgstr "" "Si è verificato un errore durante l'accesso al dispositivo {0}:\n" "{1}" #: src/Gui/MainWindow.cs:378 #, csharp-format msgid "Drive {0} is not ready." msgstr "Dispositivo {0} non disponibile." #: src/Gui/MainWindow.cs:387 #, csharp-format msgid "Drive {0} is neither mounted nor does it contain an audio cd." msgstr "Dispositivo {0} non è montato o non contiene un audio cd." #: src/Gui/MainWindow.cs:406 msgid "Confirmation" msgstr "Conferma" #: src/Gui/MainWindow.cs:407 msgid "Are you sure you really want to remove the selected volume?" msgstr "Confermare la cancellazione del volume selezionato?" #: src/Gui/MainWindow.cs:712 #, csharp-format msgid "Please insert volume '{0}'." msgstr "" #: src/Gui/MainWindow.cs:714 msgid "Waiting for volume" msgstr "" #: src/Gui/MainWindow.cs:966 msgid "Add Volume" msgstr "" #: src/Gui/MainWindow.cs:970 msgid "Search" msgstr "" #: src/Gui/MainWindow.cs:973 msgid "App Menu" msgstr "" #: src/Gui/MainWindow.cs:979 msgid "_New Database" msgstr "_Nuovo database" #: src/Gui/MainWindow.cs:982 msgid "_Open Database" msgstr "_Apri database" #: src/Gui/MainWindow.cs:985 msgid "Open Default Database" msgstr "Apri database predefinito" #: src/Gui/MainWindow.cs:991 msgid "Recent Databases" msgstr "Database recenti" #: src/Gui/MainWindow.cs:998 msgid "_Import" msgstr "_Importa" #: src/Gui/MainWindow.cs:1001 msgid "_Preferences" msgstr "_Preferenze" #: src/Gui/MainWindow.cs:1004 msgid "_Database Properties" msgstr "_Proprietà database" #: src/Gui/MainWindow.cs:1007 msgid "Info" msgstr "" #: src/Gui/MainWindow.cs:1010 msgid "_Quit" msgstr "_Esci" #: src/Gui/MainWindow.cs:1016 msgid "_Edit Volume" msgstr "_Modifica volume" #: src/Gui/MainWindow.cs:1019 msgid "_Remove Volume" msgstr "_Rimuovi volume" #: src/Gui/MainWindow.cs:1022 msgid "Rescan Volume" msgstr "" #: src/Gui/MainWindow.cs:1034 msgid "Sort by" msgstr "Ordina per" #: src/Gui/MainWindow.cs:1037 msgid "Descending" msgstr "Decrescente" #: src/Gui/MainWindow.cs:1043 msgid "Date added" msgstr "Data aggiunta" #: src/Gui/MainWindow.cs:1044 msgid "Title" msgstr "Titolo" #: src/Gui/MainWindow.cs:1045 msgid "Drivetype" msgstr "Tipo di drive" #: src/Gui/MainWindow.cs:1142 msgid "Filter volumes" msgstr "Filtra volumi" #: src/Gui/Import.cs:29 msgid "Import" msgstr "Importazione" #: src/Gui/Import.cs:30 msgid "Abort" msgstr "Interrompi" #: src/Gui/Import.cs:31 msgid "Please select a database." msgstr "" #: src/Gui/Import.cs:72 #, csharp-format msgid "{0:0}% completed." msgstr "{0:0}% completato." #: src/Gui/Import.cs:82 msgid "Import failed" msgstr "Importazione fallita" #: src/Gui/Import.cs:85 msgid "Import failed!" msgstr "Importazione non riuscita!" #: src/Gui/Import.cs:87 msgid "Import aborted." msgstr "Importazione interrotta." #: src/Gui/Import.cs:89 msgid "Import completed successfully." msgstr "Importazione completata con successo." #: src/Gui/Import.cs:121 msgid "Import in progress" msgstr "Importazione in corso" #: src/Gui/Import.cs:122 msgid "You must stop the import before closing this window." msgstr "Interrompere l'importazione prima di chiudere questa finestra." #: src/Gui/Import.cs:148 msgid "Unknown format." msgstr "" #: src/Gui/Import.cs:175 msgid "Import Database" msgstr "Importazione database" #: src/Gui/Import.cs:186 msgid "Please select a database to import" msgstr "Seleziona un database da importare" #: src/Gui/Import.cs:194 msgid "All supported formats" msgstr "" #: src/Gui/Import.cs:198 #, csharp-format msgid ".{0} files" msgstr "" #: src/Gui/Import.cs:209 msgid "Database:" msgstr "Database:" #: src/Gui/Import.cs:210 msgid "Format:" msgstr "Formato:" #: src/Gui/ItemProperties.cs:29 msgid "Item Properties" msgstr "Proprietà dell'elemento" #: src/Gui/VolumeScanner.cs:116 msgid "Scanning started." msgstr "Scansione iniziata." #: src/Gui/VolumeScanner.cs:118 #, csharp-format msgid "Scanning of drive '{0}' started." msgstr "Scansione del dispositivo '{0}' iniziata." #: src/Gui/VolumeScanner.cs:124 #, csharp-format msgid "" "Options: generate thumbs: {0}, extract metadata: {1}, discard symlinks: {2}, " "hashing: {3}." msgstr "" "Opzioni: generare anteprime: {0}, estrarre metadati: {1}, scartare symlinks: " "{2}, hashing: {3}." #: src/Gui/VolumeScanner.cs:131 #, csharp-format msgid "Options: MusicBrainz enabled: {0}" msgstr "Opzioni: MusicBrainz abilitato: {0}" #: src/Gui/VolumeScanner.cs:157 msgid "Time" msgstr "Durata" #: src/Gui/VolumeScanner.cs:161 msgid "Message" msgstr "Messaggio" #: src/Gui/VolumeScanner.cs:258 msgid "Stopping Scanner and performing rollback..." msgstr "Interruzione della scansione e ripristino..." #: src/Gui/VolumeScanner.cs:268 msgid "yes" msgstr "sì" #: src/Gui/VolumeScanner.cs:268 msgid "no" msgstr "no" #: src/Gui/VolumeScanner.cs:291 msgid "Scan in progress" msgstr "Scansione in corso" #: src/Gui/VolumeScanner.cs:291 msgid "You must stop scanning before closing this window." msgstr "Interrompere la scansione prima di chiudere questa finestra." #: src/Gui/VolumeScanner.cs:346 #, csharp-format msgid "An unhandled exception occured ({0})." msgstr "Si é verificata un'eccezione non gestita ({0})." #: src/Gui/VolumeScanner.cs:347 msgid "All database changes have been rolled back." msgstr "Tutti i cambiamenti al database sono stati annullati." #: src/Gui/VolumeScanner.cs:354 #, csharp-format msgid "Scanning failed. Reason: an unhandled exception occured ({0})." msgstr "" "Scansione fallita. Causa: si é verificata un'eccezione non gestita ({0})." #: src/Gui/VolumeScanner.cs:356 msgid "Scanning aborted." msgstr "Scansione interrotta." #: src/Gui/VolumeScanner.cs:358 msgid "Scanning completed successfully." msgstr "Scansione completata con successo." #: src/Gui/VolumeScanner.cs:488 msgid "VolumeScanner" msgstr "VolumeScanner" #: src/Gui/VolumeScanner.cs:500 msgid "Volume Information:" msgstr "Informazione volume:" #: src/Gui/VolumeScanner.cs:510 msgid "Scanner Log:" msgstr "Registro dello scanner:" #: src/Gui/VolumeScanner.cs:527 msgid "Database access" msgstr "Accesso al database" #: src/Gui/Preferences.cs:119 msgid "None" msgstr "Nessuno" #: src/Gui/Preferences.cs:228 msgid "Unsupported theme" msgstr "Tema non supportato" #: src/Gui/Preferences.cs:229 msgid "The selected icon theme is currently not supported on your system." msgstr "" "Il tema di icone selezionato non è attualmente supportato sul tuo sistema." #: src/Gui/Preferences.cs:267 msgid "Restart required" msgstr "Riavvio richiesto" #: src/Gui/Preferences.cs:268 #, csharp-format msgid "You must restart {0} for icontheme changes to take effect." msgstr "Riavvia {0} per applicare le modifiche al tema delle icone." #: src/Gui/Preferences.cs:298 msgid "Preferences" msgstr "Preferenze" #: src/Gui/Preferences.cs:322 msgid "_Load Defaults" msgstr "Carica i valori predefiniti" #: src/Gui/Preferences.cs:349 msgid "Icon theme:" msgstr "Tema delle icone:" #: src/Gui/Preferences.cs:355 msgid "Reopen most recent database on startup" msgstr "All'avvio aprire l'ultimo database utilizzato" #: src/Gui/Preferences.cs:359 msgid "Show iteminfo panel" msgstr "Mostra il pannello iteminfo" #: src/Gui/Preferences.cs:363 msgid "Show hidden files" msgstr "Mostra file nascosti" #: src/Gui/Preferences.cs:367 msgid "Show thumbnails in the filebrowser" msgstr "Mostra anteprime nel filebrowser" #: src/Gui/Preferences.cs:370 msgid "General" msgstr "Generale" #: src/Gui/Preferences.cs:378 msgid "Don't prompt, always scan:" msgstr "Non chiedere, scansionare sempre:" #: src/Gui/Preferences.cs:397 msgid "Generate Thumbnails" msgstr "Generare anteprime" #: src/Gui/Preferences.cs:401 msgid "Extract metadata" msgstr "Estrarre metadati" #: src/Gui/Preferences.cs:405 msgid "Discard symbolic links" msgstr "Escludere collegamenti" #: src/Gui/Preferences.cs:409 msgid "Compute hashcodes for files (slow!)" msgstr "Calcolare codice hash per i file (lento!)" #: src/Gui/Preferences.cs:413 msgid "Fetch audio cd metadata from MusicBrainz.org" msgstr "Prelevare metadati per audio cd da MusicBrainz.org" #: src/Gui/Preferences.cs:416 msgid "Scanner" msgstr "Scanner" Basenji/po/uk.resources0000664000175000017500000004076612067326706015326 0ustar patrickpatricklSystem.Resources.ResourceReader, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089#System.Resources.RuntimeResourceSetPADPADP̯[\ĒZFn_`/+ܽێyB_2 bJ䗖x~?ޘ ǚ˚}朮G  +Iљ,ޠ}ѬX`pѨE7kݏѝ!峸/# *?8 ڻMo;,锼xb5x,Qoĵgsv59}΍\$о DaрO51 թ}&ٍɬڴn^/gk䷧p$dF>?y7 Taq;͈nYDoY`rYrY$sYsYStYj~Ԕx06Z P4 * J  o> 8a c iz $ |q c O\mga}AKuQ>R j!ز$&P%%*U++1;v9`9vE:Iu:>Y@;CBsDH1L2Q;RfMSMeS@STXmޡY![[vk Tt ]DZ t  e E4}0P  `hVl"  w   ]N1s XZ|.  & ? QKix p '#+$"{0}" is {1}. Expected format: {2} Please correct or remove the data you entered.(empty)/Z<b>Page {0}/{1}</b> ({2} - {3} of {4} items)C&<b>Scanner Log:</b>4<b>Volume Information:</b> Abort Added: VAll database changes have been rolled back.All filesZAll itemsm^An error occured while accessing drive {0}: {1}fAn error occured while loading the volume list: {0}JAn unhandled exception occured ({0}).!ApplicationsdArchive No.vArchive No.:ArchivesvAre you sure you really want to remove the selected volume? ArtistAudio CDAudio CD trackAudiobooks+ AuthorA BackupM BytesjCategoryxCategory:FCompute hashcodes for files (slow!)ConfirmationCopyrightCopyright (c) Created:=CreatorP2Database '{0}' not found.\&Database PropertiesDatabase accessFDatabase already exists. Overwrite?Database exists,$Database not foundS&Database not found.~Database:Date addedFDefault database not found. Create?Descending,DescriptionEDescription:ODevelopmentZDimensionslDirectories|Directories:Directory,Discard symbolic linksDocuments4Don't prompt, always scan: Drive) zDrive {0} is neither mounted nor does it contain an audio cd.; .Drive {0} is not ready. Drivetype Duration Duration: Edit Item Error- Extract metadata= XFetch audio cd metadata from MusicBrainz.orgd File File count Files: Filesystem Filetype Filter volumes0 FormatI Format:W DFound {0} items in {1:F3} seconds.f GB Games General &Generate Thumbnails Genre Hash Hashed: Icon theme: Images0 ImportB Import DatabaseZ Import aborted. POT-Creation-Date: 2012-07-15 15:49+0200 PO-Revision-Date: 2011-02-05 12:11+0000 Last-Translator: Wladimir Rossinski Language-Team: Ukrainian MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Launchpad-Export-Date: 2012-10-27 11:00+0000 X-Generator: Launchpad (build 16194) "{0}" - {1}. Очікуваний формат: {2} Будь ласка, виправте або вилучіть введені дані.(порожньо)G Сторінка {0}/{1} ({2} - {3} з {4} елементів)=Почерговий запис дій сканера:,Інформація про звук:Скасувати Додано:<Всі зміни в базі даних скасовані.Усі файлиВсі елементи;Помилка з доступом до диску {0}: {1}\Виявлена помилка при завантаженні списку томів: {0}AВиникло необроблене виключення ({0}).ПрограмиАрхів №. Том №: АрхівиJВи дійсно бажаєте вилучити вибраний том?Виконавець Аудіо CDТрек аудіо CDАудіокниги АвторРезервна копія БайтівКатегоріяКатегорія:HПідрахувати хеш-коди для файлів (довго!)ПідтвердженняКопірайт"Авторські права (c) Створено: Автор0База даних '{0}' не знайдена.*Властивості бази даних%Доступ до бази данихIТака база даних вже існує. Перезаписати?%База даних вже існує)База даних не знайдена*База даних не знайдена.База даних: Додано\База даних за замовчуванням не знайдена. Створити?За спаданнямОпис Опис:РозробкаРозміри Теки: Теки:Тека:Відхилити символічні посиланняДокументи;Не запитувати, завжди сканувати:Пристрій]Диск {0} не під'єднаний та не містить звукових даних.!Диск {0} не готовий.Тип накопичувачаТривалістьТривалість: Редагувати об'єктПомилка%Вилучення метаданих`Отримати метадані для аудіо дисків із сайту MusicBrainz.orgФайлКількість файлів Файли:Файлова системаТип файлаФільтр томів Формат Формат:>Знайдено {0} об'єктів за {1:F3} секунд.ГбІгриЗагальне!Створювати ескізиЖанрХешХеширування:Тема значків:КартинкиІмпортувати*Імпортувати базу даних,Імпортування скасовано.;Імпортування успішно завершено.*Не вдалось імпортувати+Не вдалось імпортувати!%Триває імпортуванняПомилкові дані$Властивості об'єктаТипKбКлючові словаКлючові слова: МіткаМова(Час останнього записуЗавантаження...Коли позичено:Кому позичено:РозташуванняМбПовідомлення Різне Фільми Музика Назва Назва:Ні!Елементи відсутні$Пошук нічого не дав.ВідсутнійПримітка3Відкрити основну базу данихНазва опції3Функції: MusicBrainz ввімкнено: {0}Параметри: Попередній перегляд: {0}, Вилучення мета-даних: {1}, Без посилань на символи: {2}, Хеширувати: {3}.Інше#Кількість сторінокКартинкиTБудь ласка, введіть назву для нової бази даних9Будь ласка, виберіть базу данихOБудь ласка, виберіть базу даних для імпортуJБудь ласка, виберіть диск для скануванняНалаштуванняВиробник"Останні бази даних`Повторне відкриття останньої бази даних при запуску)Необхідний перезапускМає повернути:!Триває сканування Сканер(Сканування скасоване.7Сканування успішно завершено.}Не вдалось виконати сканування. Причина: необроблене виключення ({0}).=Виконується сканування диска '{0}'.,Виконується сканування.Пошук об'єктівПошук записівТриває пошук...2Показувати приховані файли(Показати панель "iteminfo"bПоказувати ескізи зображень у вікні перегляду файлів РозмірПрограмиСортувати заaЗупинка сканера та повернення на початкову позицію...5Об'єкт символьного посиланняTб ТекстВибрана тема значків на даний момент не підтримується вашою системою.FЦя версія бази даних не підтримується.Час~Перевищення ліміту часу: можливо, ще один пошук все ще продовжується.ЗаголовокЗаголовок:Досить значна кількість результатів пошуку. Будь ласка, змініть критерії пошуку. Загальний розмір: Трек №.Доріжки:ТипНевідомийБез назви@Версія бази даних не підтримується%Непідтримувана тема/Використовується VolumeDB v{0}. ВідеоТомВластивості томуТип носія: Файли бази данних$Глибина сканування.*Очікування пристроїв...РікТакwВи повинні перезапустити {0} для застосування змін в темі значків.`Щоб закрити це вікно Ви повинні зупинити сканування.pВи повинні зупинити імпортування перед тим, як закрити вікно.+Вла_стивості бази данихВилу_чити том_Імпортувати=Заванта_жити початкові параметри_Нова база даних%_Відкрити базу данихНа_лаштування Ви_хідВилучит_и томвідза замовчуванням файлизнікомпозиціїтак{0:0}% завершено.{0} Байтів{0} вже запущено.&{0} томів завантажено.Basenji/po/Basenji.pot0000664000175000017500000004210412067326706015036 0ustar patrickpatrick# 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: 2012-07-15 15:49+0200\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" #: src/Util.cs:30 #, csharp-format msgid "{0} Bytes" msgstr "" #: src/Util.cs:32 msgid "Bytes" msgstr "" #: src/Util.cs:32 msgid "KB" msgstr "" #: src/Util.cs:32 msgid "MB" msgstr "" #: src/Util.cs:32 msgid "GB" msgstr "" #: src/Util.cs:32 msgid "TB" msgstr "" #: src/Options.cs:477 msgid "OptionName" msgstr "" #: src/FileDialog.cs:51 msgid "VolumeDatabase files" msgstr "" #: src/FileDialog.cs:56 msgid "All files" msgstr "" #: src/Main.cs:142 src/Gui/MainWindow.cs:76 src/Gui/MainWindow.cs:92 #: src/Gui/MainWindow.cs:334 src/Gui/MainWindow.cs:355 #: src/Gui/MainWindow.cs:377 src/Gui/MainWindow.cs:386 #: src/Gui/MainWindow.cs:635 msgid "Error" msgstr "" #: src/Main.cs:142 #, csharp-format msgid "{0} is already running." msgstr "" #: src/Gui/Widgets/VolumeView.cs:42 src/Gui/Widgets/SearchResultView.cs:30 msgid "Unnamed" msgstr "" #: src/Gui/Widgets/VolumeView.cs:43 #: src/Gui/Widgets/Editors/VolumeEditor.cs:259 msgid "Category:" msgstr "" #: src/Gui/Widgets/VolumeView.cs:44 msgid "files" msgstr "" #: src/Gui/Widgets/VolumeView.cs:45 msgid "tracks" msgstr "" #: src/Gui/Widgets/ItemView.cs:29 msgid "Loading..." msgstr "" #: src/Gui/Widgets/ItemView.cs:30 msgid "(empty)" msgstr "" #: src/Gui/Widgets/ItemView.cs:99 src/Gui/DriveSelection.cs:80 msgid "Unknown" msgstr "" #: src/Gui/Widgets/ItemView.cs:170 src/Gui/Widgets/Editors/ItemEditor.cs:96 msgid "Name" msgstr "" #: src/Gui/Widgets/ItemView.cs:176 msgid "Artist" msgstr "" #: src/Gui/Widgets/ItemView.cs:181 #: src/Gui/Widgets/Editors/AudioTrackItemEditor.cs:53 #: src/Gui/Widgets/ItemInfo.cs:225 src/Gui/Widgets/ItemInfo.cs:288 msgid "Duration" msgstr "" #: src/Gui/Widgets/Editors/FileSystemVolumeEditor.cs:34 #: src/Gui/DriveSelection.cs:168 msgid "Filesystem" msgstr "" #: src/Gui/Widgets/Editors/FileSystemVolumeEditor.cs:65 msgid "Files:" msgstr "" #: src/Gui/Widgets/Editors/FileSystemVolumeEditor.cs:66 msgid "Directories:" msgstr "" #: src/Gui/Widgets/Editors/FileSystemVolumeEditor.cs:67 msgid "Total size:" msgstr "" #: src/Gui/Widgets/Editors/ItemEditor.cs:95 msgid "Item type" msgstr "" #: src/Gui/Widgets/Editors/ItemEditor.cs:111 src/Gui/Widgets/ItemInfo.cs:371 msgid "Note" msgstr "" #: src/Gui/Widgets/Editors/ItemEditor.cs:112 src/Gui/Widgets/ItemInfo.cs:374 msgid "Keywords" msgstr "" #: src/Gui/Widgets/Editors/AudioTrackItemEditor.cs:31 #: src/Gui/Widgets/SearchResultView.cs:34 msgid "Audio CD track" msgstr "" #: src/Gui/Widgets/Editors/AudioTrackItemEditor.cs:54 #: src/Gui/Widgets/ItemInfo.cs:230 msgid "Type" msgstr "" #: src/Gui/Widgets/Editors/DirectoryItemEditor.cs:28 msgid "Directory" msgstr "" #: src/Gui/Widgets/Editors/FileSystemItemEditor.cs:59 #: src/Gui/Widgets/SearchResultView.cs:31 src/Gui/Widgets/ItemInfo.cs:183 msgid "Location" msgstr "" #: src/Gui/Widgets/Editors/FileSystemItemEditor.cs:60 #: src/Gui/Widgets/ItemInfo.cs:185 msgid "Last write time" msgstr "" #: src/Gui/Widgets/Editors/FileSystemItemEditor.cs:61 #: src/Gui/Widgets/ItemInfo.cs:210 msgid "Filetype" msgstr "" #: src/Gui/Widgets/Editors/FileItemEditor.cs:31 msgid "File" msgstr "" #: src/Gui/Widgets/Editors/FileItemEditor.cs:52 #: src/Gui/Widgets/ItemInfo.cs:204 src/Gui/Widgets/ItemInfo.cs:226 #: src/Gui/DriveSelection.cs:148 msgid "Size" msgstr "" #: src/Gui/Widgets/Editors/FileItemEditor.cs:53 #: src/Gui/Widgets/ItemInfo.cs:206 msgid "Hash" msgstr "" #: src/Gui/Widgets/Editors/AudioCdVolumeEditor.cs:33 msgid "Audio CD" msgstr "" #: src/Gui/Widgets/Editors/AudioCdVolumeEditor.cs:63 msgid "Tracks:" msgstr "" #: src/Gui/Widgets/Editors/AudioCdVolumeEditor.cs:64 msgid "Duration:" msgstr "" #: src/Gui/Widgets/Editors/VolumeEditor.cs:45 msgid "Backup" msgstr "" #: src/Gui/Widgets/Editors/VolumeEditor.cs:46 #: src/Gui/Widgets/CategoryView.cs:60 msgid "Documents" msgstr "" #: src/Gui/Widgets/Editors/VolumeEditor.cs:47 #: src/Gui/Widgets/CategoryView.cs:61 msgid "Music" msgstr "" #: src/Gui/Widgets/Editors/VolumeEditor.cs:48 msgid "Audiobooks" msgstr "" #: src/Gui/Widgets/Editors/VolumeEditor.cs:49 #: src/Gui/Widgets/CategoryView.cs:62 msgid "Movies" msgstr "" #: src/Gui/Widgets/Editors/VolumeEditor.cs:50 msgid "Videos" msgstr "" #: src/Gui/Widgets/Editors/VolumeEditor.cs:51 msgid "Pictures" msgstr "" #: src/Gui/Widgets/Editors/VolumeEditor.cs:52 msgid "Games" msgstr "" #: src/Gui/Widgets/Editors/VolumeEditor.cs:53 src/Gui/Widgets/ItemInfo.cs:319 msgid "Software" msgstr "" #: src/Gui/Widgets/Editors/VolumeEditor.cs:54 msgid "Misc" msgstr "" #: src/Gui/Widgets/Editors/VolumeEditor.cs:55 msgid "Other" msgstr "" #: src/Gui/Widgets/Editors/VolumeEditor.cs:225 msgid "Yes" msgstr "" #: src/Gui/Widgets/Editors/VolumeEditor.cs:225 msgid "No" msgstr "" #: src/Gui/Widgets/Editors/VolumeEditor.cs:235 msgid "Volume type:" msgstr "" #: src/Gui/Widgets/Editors/VolumeEditor.cs:236 msgid "Hashed:" msgstr "" #: src/Gui/Widgets/Editors/VolumeEditor.cs:237 msgid "Added:" msgstr "" #: src/Gui/Widgets/Editors/VolumeEditor.cs:258 msgid "Archive No.:" msgstr "" #: src/Gui/Widgets/Editors/VolumeEditor.cs:260 msgid "Title:" msgstr "" #: src/Gui/Widgets/Editors/VolumeEditor.cs:261 src/Gui/DBProperties.cs:98 msgid "Description:" msgstr "" #: src/Gui/Widgets/Editors/VolumeEditor.cs:262 msgid "Keywords:" msgstr "" #: src/Gui/Widgets/Editors/VolumeEditor.cs:263 msgid "Loaned to:" msgstr "" #: src/Gui/Widgets/Editors/VolumeEditor.cs:264 msgid "Loaned date:" msgstr "" #: src/Gui/Widgets/Editors/VolumeEditor.cs:265 msgid "Return date:" msgstr "" #: src/Gui/Widgets/CategoryView.cs:58 msgid "Directories" msgstr "" #: src/Gui/Widgets/CategoryView.cs:59 msgid "Text" msgstr "" #: src/Gui/Widgets/CategoryView.cs:63 msgid "Images" msgstr "" #: src/Gui/Widgets/CategoryView.cs:64 msgid "Applications" msgstr "" #: src/Gui/Widgets/CategoryView.cs:65 msgid "Archives" msgstr "" #: src/Gui/Widgets/CategoryView.cs:66 msgid "Development" msgstr "" #: src/Gui/Widgets/CategoryView.cs:96 src/Gui/MainWindow.cs:1046 msgid "Category" msgstr "" #: src/Gui/Widgets/CategoryView.cs:128 msgid "All items" msgstr "" #: src/Gui/Widgets/SearchResultView.cs:32 msgid "Volume" msgstr "" #: src/Gui/Widgets/SearchResultView.cs:33 src/Gui/MainWindow.cs:1040 msgid "Archive No." msgstr "" #: src/Gui/Widgets/ItemInfo.cs:40 msgid "by" msgstr "" #: src/Gui/Widgets/ItemInfo.cs:41 msgid "from" msgstr "" #: src/Gui/Widgets/ItemInfo.cs:196 msgid "Symlink target" msgstr "" #: src/Gui/Widgets/ItemInfo.cs:227 msgid "Track No." msgstr "" #: src/Gui/Widgets/ItemInfo.cs:258 msgid "Genre" msgstr "" #: src/Gui/Widgets/ItemInfo.cs:278 msgid "Year" msgstr "" #: src/Gui/Widgets/ItemInfo.cs:283 msgid "Description" msgstr "" #: src/Gui/Widgets/ItemInfo.cs:294 msgid "Dimensions" msgstr "" #: src/Gui/Widgets/ItemInfo.cs:299 msgid "Format" msgstr "" #: src/Gui/Widgets/ItemInfo.cs:303 msgid "Author" msgstr "" #: src/Gui/Widgets/ItemInfo.cs:307 msgid "Copyright" msgstr "" #: src/Gui/Widgets/ItemInfo.cs:311 msgid "Producer" msgstr "" #: src/Gui/Widgets/ItemInfo.cs:315 msgid "Creator" msgstr "" #: src/Gui/Widgets/ItemInfo.cs:323 msgid "Language" msgstr "" #: src/Gui/Widgets/ItemInfo.cs:327 msgid "Page count" msgstr "" #: src/Gui/Widgets/ItemInfo.cs:346 msgid "File count" msgstr "" #: src/Gui/Widgets/PageNavigation.cs:27 msgid "No items." msgstr "" #: src/Gui/Widgets/PageNavigation.cs:145 #, csharp-format msgid "Page {0}/{1} ({2} - {3} of {4} items)" msgstr "" #: src/Gui/ObjectProperties.cs:54 src/Gui/VolumeScanner.cs:248 msgid "Invalid data" msgstr "" #: src/Gui/ObjectProperties.cs:54 src/Gui/VolumeScanner.cs:249 #, csharp-format msgid "" "\"{0}\" is {1}.\n" "\n" "Expected format: {2}\n" "Please correct or remove the data you entered." msgstr "" #: src/Gui/DBProperties.cs:85 msgid "Database Properties" msgstr "" #: src/Gui/DBProperties.cs:97 msgid "Name:" msgstr "" #: src/Gui/DBProperties.cs:99 msgid "Created:" msgstr "" #: src/Gui/VolumeProperties.cs:29 msgid "Volume Properties" msgstr "" #: src/Gui/DriveSelection.cs:60 msgid "Waiting for drives..." msgstr "" #: src/Gui/DriveSelection.cs:133 msgid "Drive" msgstr "" #: src/Gui/DriveSelection.cs:139 msgid "Label" msgstr "" #: src/Gui/DriveSelection.cs:241 msgid "Please select a drive to scan" msgstr "" #: src/Gui/About.cs:28 msgid "A cross-platform media indexing/search tool." msgstr "" #: src/Gui/About.cs:29 #, csharp-format msgid "Using VolumeDB v{0}." msgstr "" #: src/Gui/About.cs:31 msgid "Copyright (c) " msgstr "" #: src/Gui/ItemSearch.cs:81 #, csharp-format msgid "Found {0} items in {1:F3} seconds." msgstr "" #: src/Gui/ItemSearch.cs:92 src/Gui/MainWindow.cs:519 msgid "Timeout: another search is probably still in progress." msgstr "" #: src/Gui/ItemSearch.cs:94 msgid "Too many search results. Please refine your search criteria." msgstr "" #: src/Gui/ItemSearch.cs:112 src/Gui/MainWindow.cs:535 msgid "Searching..." msgstr "" #: src/Gui/ItemSearch.cs:267 msgid "Search Items" msgstr "" #: src/Gui/ItemSearch.cs:279 src/Gui/MainWindow.cs:1145 msgid "default" msgstr "" #: src/Gui/ItemSearch.cs:283 msgid "Search items" msgstr "" #: src/Gui/ItemSearch.cs:318 msgid "Quick tip:" msgstr "" #: src/Gui/ItemSearch.cs:319 #, csharp-format msgid "" "Click on the icon to the left of the search field to build advanced search " "queries.\n" "Example: {0}" msgstr "" #: src/Gui/ItemSearch.cs:326 msgid "No search results." msgstr "" #: src/Gui/ItemSearch.cs:375 src/Gui/MainWindow.cs:1028 msgid "Edit Item" msgstr "" #: src/Gui/ItemSearch.cs:382 msgid "Show in Main Window" msgstr "" #: src/Gui/MainWindow.cs:77 src/Gui/MainWindow.cs:93 src/Gui/MainWindow.cs:635 #, csharp-format msgid "Database '{0}' not found." msgstr "" #: src/Gui/MainWindow.cs:185 msgid "Database not found" msgstr "" #: src/Gui/MainWindow.cs:186 msgid "Default database not found. Create?" msgstr "" #: src/Gui/MainWindow.cs:215 msgid "Unsupported database version" msgstr "" #: src/Gui/MainWindow.cs:216 msgid "This database version is not supported." msgstr "" #: src/Gui/MainWindow.cs:235 #, csharp-format msgid "{0} volumes loaded." msgstr "" #: src/Gui/MainWindow.cs:256 #, csharp-format msgid "An error occured while loading the volume list: {0}" msgstr "" #: src/Gui/MainWindow.cs:300 msgid "Please enter the name for the new database" msgstr "" #: src/Gui/MainWindow.cs:312 msgid "Database exists" msgstr "" #: src/Gui/MainWindow.cs:313 msgid "Database already exists. Overwrite?" msgstr "" #: src/Gui/MainWindow.cs:326 msgid "Please select a database" msgstr "" #: src/Gui/MainWindow.cs:335 src/Gui/Import.cs:83 msgid "Database not found." msgstr "" #: src/Gui/MainWindow.cs:356 #, csharp-format msgid "" "An error occured while accessing drive {0}:\n" "{1}" msgstr "" #: src/Gui/MainWindow.cs:378 #, csharp-format msgid "Drive {0} is not ready." msgstr "" #: src/Gui/MainWindow.cs:387 #, csharp-format msgid "Drive {0} is neither mounted nor does it contain an audio cd." msgstr "" #: src/Gui/MainWindow.cs:406 msgid "Confirmation" msgstr "" #: src/Gui/MainWindow.cs:407 msgid "Are you sure you really want to remove the selected volume?" msgstr "" #: src/Gui/MainWindow.cs:712 #, csharp-format msgid "Please insert volume '{0}'." msgstr "" #: src/Gui/MainWindow.cs:714 msgid "Waiting for volume" msgstr "" #: src/Gui/MainWindow.cs:966 msgid "Add Volume" msgstr "" #: src/Gui/MainWindow.cs:970 msgid "Search" msgstr "" #: src/Gui/MainWindow.cs:973 msgid "App Menu" msgstr "" #: src/Gui/MainWindow.cs:979 msgid "_New Database" msgstr "" #: src/Gui/MainWindow.cs:982 msgid "_Open Database" msgstr "" #: src/Gui/MainWindow.cs:985 msgid "Open Default Database" msgstr "" #: src/Gui/MainWindow.cs:991 msgid "Recent Databases" msgstr "" #: src/Gui/MainWindow.cs:998 msgid "_Import" msgstr "" #: src/Gui/MainWindow.cs:1001 msgid "_Preferences" msgstr "" #: src/Gui/MainWindow.cs:1004 msgid "_Database Properties" msgstr "" #: src/Gui/MainWindow.cs:1007 msgid "Info" msgstr "" #: src/Gui/MainWindow.cs:1010 msgid "_Quit" msgstr "" #: src/Gui/MainWindow.cs:1016 msgid "_Edit Volume" msgstr "" #: src/Gui/MainWindow.cs:1019 msgid "_Remove Volume" msgstr "" #: src/Gui/MainWindow.cs:1022 msgid "Rescan Volume" msgstr "" #: src/Gui/MainWindow.cs:1034 msgid "Sort by" msgstr "" #: src/Gui/MainWindow.cs:1037 msgid "Descending" msgstr "" #: src/Gui/MainWindow.cs:1043 msgid "Date added" msgstr "" #: src/Gui/MainWindow.cs:1044 msgid "Title" msgstr "" #: src/Gui/MainWindow.cs:1045 msgid "Drivetype" msgstr "" #: src/Gui/MainWindow.cs:1142 msgid "Filter volumes" msgstr "" #: src/Gui/Import.cs:29 msgid "Import" msgstr "" #: src/Gui/Import.cs:30 msgid "Abort" msgstr "" #: src/Gui/Import.cs:31 msgid "Please select a database." msgstr "" #: src/Gui/Import.cs:72 #, csharp-format msgid "{0:0}% completed." msgstr "" #: src/Gui/Import.cs:82 msgid "Import failed" msgstr "" #: src/Gui/Import.cs:85 msgid "Import failed!" msgstr "" #: src/Gui/Import.cs:87 msgid "Import aborted." msgstr "" #: src/Gui/Import.cs:89 msgid "Import completed successfully." msgstr "" #: src/Gui/Import.cs:121 msgid "Import in progress" msgstr "" #: src/Gui/Import.cs:122 msgid "You must stop the import before closing this window." msgstr "" #: src/Gui/Import.cs:148 msgid "Unknown format." msgstr "" #: src/Gui/Import.cs:175 msgid "Import Database" msgstr "" #: src/Gui/Import.cs:186 msgid "Please select a database to import" msgstr "" #: src/Gui/Import.cs:194 msgid "All supported formats" msgstr "" #: src/Gui/Import.cs:198 #, csharp-format msgid ".{0} files" msgstr "" #: src/Gui/Import.cs:209 msgid "Database:" msgstr "" #: src/Gui/Import.cs:210 msgid "Format:" msgstr "" #: src/Gui/ItemProperties.cs:29 msgid "Item Properties" msgstr "" #: src/Gui/VolumeScanner.cs:116 msgid "Scanning started." msgstr "" #: src/Gui/VolumeScanner.cs:118 #, csharp-format msgid "Scanning of drive '{0}' started." msgstr "" #: src/Gui/VolumeScanner.cs:124 #, csharp-format msgid "" "Options: generate thumbs: {0}, extract metadata: {1}, discard symlinks: {2}, " "hashing: {3}." msgstr "" #: src/Gui/VolumeScanner.cs:131 #, csharp-format msgid "Options: MusicBrainz enabled: {0}" msgstr "" #: src/Gui/VolumeScanner.cs:157 msgid "Time" msgstr "" #: src/Gui/VolumeScanner.cs:161 msgid "Message" msgstr "" #: src/Gui/VolumeScanner.cs:258 msgid "Stopping Scanner and performing rollback..." msgstr "" #: src/Gui/VolumeScanner.cs:268 msgid "yes" msgstr "" #: src/Gui/VolumeScanner.cs:268 msgid "no" msgstr "" #: src/Gui/VolumeScanner.cs:291 msgid "Scan in progress" msgstr "" #: src/Gui/VolumeScanner.cs:291 msgid "You must stop scanning before closing this window." msgstr "" #: src/Gui/VolumeScanner.cs:346 #, csharp-format msgid "An unhandled exception occured ({0})." msgstr "" #: src/Gui/VolumeScanner.cs:347 msgid "All database changes have been rolled back." msgstr "" #: src/Gui/VolumeScanner.cs:354 #, csharp-format msgid "Scanning failed. Reason: an unhandled exception occured ({0})." msgstr "" #: src/Gui/VolumeScanner.cs:356 msgid "Scanning aborted." msgstr "" #: src/Gui/VolumeScanner.cs:358 msgid "Scanning completed successfully." msgstr "" #: src/Gui/VolumeScanner.cs:488 msgid "VolumeScanner" msgstr "" #: src/Gui/VolumeScanner.cs:500 msgid "Volume Information:" msgstr "" #: src/Gui/VolumeScanner.cs:510 msgid "Scanner Log:" msgstr "" #: src/Gui/VolumeScanner.cs:527 msgid "Database access" msgstr "" #: src/Gui/Preferences.cs:119 msgid "None" msgstr "" #: src/Gui/Preferences.cs:228 msgid "Unsupported theme" msgstr "" #: src/Gui/Preferences.cs:229 msgid "The selected icon theme is currently not supported on your system." msgstr "" #: src/Gui/Preferences.cs:267 msgid "Restart required" msgstr "" #: src/Gui/Preferences.cs:268 #, csharp-format msgid "You must restart {0} for icontheme changes to take effect." msgstr "" #: src/Gui/Preferences.cs:298 msgid "Preferences" msgstr "" #: src/Gui/Preferences.cs:322 msgid "_Load Defaults" msgstr "" #: src/Gui/Preferences.cs:349 msgid "Icon theme:" msgstr "" #: src/Gui/Preferences.cs:355 msgid "Reopen most recent database on startup" msgstr "" #: src/Gui/Preferences.cs:359 msgid "Show iteminfo panel" msgstr "" #: src/Gui/Preferences.cs:363 msgid "Show hidden files" msgstr "" #: src/Gui/Preferences.cs:367 msgid "Show thumbnails in the filebrowser" msgstr "" #: src/Gui/Preferences.cs:370 msgid "General" msgstr "" #: src/Gui/Preferences.cs:378 msgid "Don't prompt, always scan:" msgstr "" #: src/Gui/Preferences.cs:397 msgid "Generate Thumbnails" msgstr "" #: src/Gui/Preferences.cs:401 msgid "Extract metadata" msgstr "" #: src/Gui/Preferences.cs:405 msgid "Discard symbolic links" msgstr "" #: src/Gui/Preferences.cs:409 msgid "Compute hashcodes for files (slow!)" msgstr "" #: src/Gui/Preferences.cs:413 msgid "Fetch audio cd metadata from MusicBrainz.org" msgstr "" #: src/Gui/Preferences.cs:416 msgid "Scanner" msgstr "" Basenji/po/nl.resources0000664000175000017500000003273612067326706015316 0ustar patrickpatricklSystem.Resources.ResourceReader, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089#System.Resources.RuntimeResourceSetPADPADP̯[\ĒZFn_`/+ܽێyB_2 bJ䗖x~?ޘ ǚ˚}朮G  +Iљ,ޠ}ѬX`pѨE7kݏѝ!峸/# *?8 ڻMo;,锼xb5x,Qoĵgsv59}΍\$о DaрO51 թ}&ٍɬڴn^/gk䷧p$dF>?y7 Taq;͈nYDoY`rYrY$sYsYStYj~Ԕx06Z P4 * J  o> 8a c iz $ |q c O\mga}AKuQ>R j!ز$&P%%*U++1;v9`9vE:Iu:>Y@;CBsDH1L2Q;RfMSMeS@STXmޡY![[vk Tt ]DZ t  e E4}0P  `hVl"  w   ]N1s XZ|.  & ? QKix p '#+$"{0}" is {1}. Expected format: {2} Please correct or remove the data you entered.(empty)Z<b>Page {0}/{1}</b> ({2} - {3} of {4} items)&<b>Scanner Log:</b>84<b>Volume Information:</b>M Aborth Added:rVAll database changes have been rolled back.All filesAll items^An error occured while accessing drive {0}: {1}fAn error occured while loading the volume list: {0}JAn unhandled exception occured ({0}).2ApplicationsVArchive No.cArchive No.:pArchives|vAre you sure you really want to remove the selected volume? ArtistAudio CDAudio CD trackAudiobooks Author Backup BytesCategory Category:FCompute hashcodes for files (slow!)$ConfirmationOCopyright\Copyright (c) gCreated:wCreator2Database '{0}' not found.&Database PropertiesDatabase accessFDatabase already exists. Overwrite?Database exists$Database not found5&Database not found.TDatabase:tDate addedFDefault database not found. Create?DescendingDescriptionDescription:DevelopmentDimensionsDirectories Directories:Directory,Discard symbolic links#DocumentsD4Don't prompt, always scan:P DrivekzDrive {0} is neither mounted nor does it contain an audio cd.t.Drive {0} is not ready.DrivetypeDurationDuration:Edit Item Error Extract metadataXFetch audio cd metadata from MusicBrainz.org File9File countB Files:TFilesystem`FiletypeqFilter volumes FormatFormat:DFound {0} items in {1:F3} seconds.GB GamesGeneral&Generate Thumbnails GenreHashHashed:Icon theme: Images% Import3Import Database>Import aborted.Y POT-Creation-Date: 2012-07-15 15:49+0200 PO-Revision-Date: 2011-04-04 08:46+0000 Last-Translator: Bjorn Robijns Language-Team: Dutch MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Launchpad-Export-Date: 2012-10-27 11:00+0000 X-Generator: Launchpad (build 16194) \"{0}" is {1}. Verwachte indeling: {2} Corrigeer of verwijder de data die u heeft ingevoerd.(leeg)/Pagina {0}/{1} ({2} - {3} of {4} items)Scanner log:Volume Informatie:Afbreken Toegevoegd:!Alle wijzigingen zijn teruggezet.Alle bestanden Alle items4Een fout trad op bij het lezen van station {0}: {1}U moet {0} opnieuw opstarten om het icoon thema toe te passen.1U moet de scan stoppen om het venster te sluiten.8U moet het importeren stoppen om het venster te sluiten.Gegevensbestand eigenschappenVolume _bewerken _Importeren_Laad standaard_Nieuw gegevensbestand_Open gegevensbestand _Voorkeuren _AfsluitenVolume _verwijderendoorstandaad bestandenvanneenummersja{0:0}% voltooid. {0} Bytes{0} wordt al uitgevoerd.{0} volumes geladen.Basenji/po/da.resources0000664000175000017500000001532312067326706015262 0ustar patrickpatricklSystem.Resources.ResourceReader, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089#System.Resources.RuntimeResourceSet`PADPADP̯ĒZFn_`/+ܽێyB_ bJ䗖˚G +Iљ}E7k!峸/ *? xb5x,Qosv̾ DЍɬgk愪F>?q;DoY`rYrY$sYsYStYj~Ԕx06Z * J  iz $ |q c mAQ>R ز$&P%%`9Iu:>H1LfMSMeSTX![[] bObZgjl8npKt1vݷ wq|oт|e|)| } ~&[ CL ` 07 h& \ U )c-  1K xL ) {   7  = *J BS( R  _  "{0}" is {1}. Expected format: {2} Please correct or remove the data you entered.(empty)&<b>Scanner Log:</b>4<b>Volume Information:</b> Added:!VAll database changes have been rolled back.-All filesY^An error occured while accessing drive {0}: {1}eJAn unhandled exception occured ({0}).vAre you sure you really want to remove the selected volume? Backup BytesCategory:ConfirmationCopyright (c) Created:/2Database '{0}' not found.:&Database PropertiesWDatabase accesslFDatabase already exists. Overwrite?}Database exists&Database not found.Description:Directories:Documents Drive.Drive {0} is not ready. Error Files:#Filesystem+DFound {0} items in {1:F3} seconds.6GB\General`Hashed:jIcon theme:sInvalid dataKBKeywords: LabelLoading...Loaned date:Loaned to:MBMessageMisc Movies Music Name:NoNone OtherPictures TPlease enter the name for the new database0Please select a databaseE:Please select a drive to scanaPreferencesLReopen most recent database on startup Restart requiredReturn date: Scan in progressScanner"Scanning aborted.@Scanning completed successfully. |Scanning failed. Reason: an unhandled exception occured ({0})./Search ItemsrSearching...SizeVStopping Scanner and performing rollback...TBNThis database version is not supported.TimelTimeout: another search is probably still in progress. Title:&Total size:.8Unsupported database versionB(Using VolumeDB v{0}.f"Volume Properties}Volume type:(VolumeDatabase filesVolumeScanner*Waiting for drives...YesdYou must stop scanning before closing this window.(_Database Properties_Load Defaults&_New DatabaseF_Open DatabaseT_Preferencese _Quitu_Remove Volume~noyes{0} Bytes.{0} is already running.&{0} volumes loaded.Project-Id-Version: basenji Report-Msgid-Bugs-To: FULL NAME POT-Creation-Date: 2012-07-15 15:49+0200 PO-Revision-Date: 2008-11-21 23:20+0000 Last-Translator: nanker Language-Team: Danish MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Launchpad-Export-Date: 2012-10-27 11:00+0000 X-Generator: Launchpad (build 16194) T"{0}" is {1}. Forventet format: {2} Ret venligst eller fjern de data du indtastede.(tom)Skanningslog:Volume Information: Tilføjet:*Alle databaseændringer er rullet tilbage. Alle filer-En fejl opstod under adgang til drev {0}: {1}#En uventet undtagelse opstod ({0}).=Er du sikker på at du virkelig vil fjerne den valgte volume?BackupByte Kategori: BekræftelseCopyright (c)  Oprettet:Database '{0}' ikke fundet.Database egenskaberDatabase adgang%Databasen findes allerede. Overskriv?Databasen findes alleredeDatabasen blev ikke fundet. Beskrivelse: Kataloger: DokumenterDrevDrev {0} ikke klar.FejlFiler: Filsystem$Fandt {0} emner på {1:F3} sekunder.GBGenereltHashed: Ikon tema: Ugyldige dataKB Nøgleord:Mærkat Indlæser... Lånedato: Lånt til:MB MeddelelseDiverseFilmMusikNavn:NejIngenAndetBilleder,Indtast venligst navnet på den nye databaseVælg venligst en database#Vælg venligst et drev til skanning Indstillinger'Genåben den seneste database ved startGenstart påkrævet Retur dato:Skanning pågårSkannerSkanning afbrudt Skanning gennemført med succes.ASkanning mislykkedes. Årsag: En uventet undtagelse opstod ({0}). Søge emner Søger... Størrelse%Stopper skanning og ruller tilbage...TB)Denne databaseversion ikke understøttet.Tid3Stoppet: en anden søgning pågår sikkert fortsat.Titel:Samlet størrelse:"Ikke understøttet databaseversionBruger VolumeDB v{0}.Volume rettigheder Volume type:VolumeDatabase filerVolumen skannerVenter på drev...Ja/Du skal stoppe skanning før du lukker vinduet._Database rettigheder_Indlæs standardindstillinger _Ny database_Åben database_Indstillinger_Afslut _Fjer Volumenejja{0} byte{0} kører allerede.{0} volumes indlæst.Basenji/po/da.po0000664000175000017500000004546412067326706013677 0ustar patrickpatrick# Danish translation for basenji # Copyright (c) 2008 Rosetta Contributors and Canonical Ltd 2008 # This file is distributed under the same license as the basenji package. # FIRST AUTHOR , 2008. # msgid "" msgstr "" "Project-Id-Version: basenji\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2012-07-15 15:49+0200\n" "PO-Revision-Date: 2008-11-21 23:20+0000\n" "Last-Translator: nanker \n" "Language-Team: Danish \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2012-10-27 11:00+0000\n" "X-Generator: Launchpad (build 16194)\n" #: src/Util.cs:30 #, csharp-format msgid "{0} Bytes" msgstr "{0} byte" #: src/Util.cs:32 msgid "Bytes" msgstr "Byte" #: src/Util.cs:32 msgid "KB" msgstr "KB" #: src/Util.cs:32 msgid "MB" msgstr "MB" #: src/Util.cs:32 msgid "GB" msgstr "GB" #: src/Util.cs:32 msgid "TB" msgstr "TB" #: src/Options.cs:477 msgid "OptionName" msgstr "" #: src/FileDialog.cs:51 msgid "VolumeDatabase files" msgstr "VolumeDatabase filer" #: src/FileDialog.cs:56 msgid "All files" msgstr "Alle filer" #: src/Main.cs:142 src/Gui/MainWindow.cs:76 src/Gui/MainWindow.cs:92 #: src/Gui/MainWindow.cs:334 src/Gui/MainWindow.cs:355 #: src/Gui/MainWindow.cs:377 src/Gui/MainWindow.cs:386 #: src/Gui/MainWindow.cs:635 msgid "Error" msgstr "Fejl" #: src/Main.cs:142 #, csharp-format msgid "{0} is already running." msgstr "{0} kører allerede." #: src/Gui/Widgets/VolumeView.cs:42 src/Gui/Widgets/SearchResultView.cs:30 msgid "Unnamed" msgstr "" #: src/Gui/Widgets/VolumeView.cs:43 #: src/Gui/Widgets/Editors/VolumeEditor.cs:259 msgid "Category:" msgstr "Kategori:" #: src/Gui/Widgets/VolumeView.cs:44 msgid "files" msgstr "" #: src/Gui/Widgets/VolumeView.cs:45 msgid "tracks" msgstr "" #: src/Gui/Widgets/ItemView.cs:29 msgid "Loading..." msgstr "Indlæser..." #: src/Gui/Widgets/ItemView.cs:30 msgid "(empty)" msgstr "(tom)" #: src/Gui/Widgets/ItemView.cs:99 src/Gui/DriveSelection.cs:80 msgid "Unknown" msgstr "" #: src/Gui/Widgets/ItemView.cs:170 src/Gui/Widgets/Editors/ItemEditor.cs:96 msgid "Name" msgstr "" #: src/Gui/Widgets/ItemView.cs:176 msgid "Artist" msgstr "" #: src/Gui/Widgets/ItemView.cs:181 #: src/Gui/Widgets/Editors/AudioTrackItemEditor.cs:53 #: src/Gui/Widgets/ItemInfo.cs:225 src/Gui/Widgets/ItemInfo.cs:288 msgid "Duration" msgstr "" #: src/Gui/Widgets/Editors/FileSystemVolumeEditor.cs:34 #: src/Gui/DriveSelection.cs:168 msgid "Filesystem" msgstr "Filsystem" #: src/Gui/Widgets/Editors/FileSystemVolumeEditor.cs:65 msgid "Files:" msgstr "Filer:" #: src/Gui/Widgets/Editors/FileSystemVolumeEditor.cs:66 msgid "Directories:" msgstr "Kataloger:" #: src/Gui/Widgets/Editors/FileSystemVolumeEditor.cs:67 msgid "Total size:" msgstr "Samlet størrelse:" #: src/Gui/Widgets/Editors/ItemEditor.cs:95 msgid "Item type" msgstr "" #: src/Gui/Widgets/Editors/ItemEditor.cs:111 src/Gui/Widgets/ItemInfo.cs:371 msgid "Note" msgstr "" #: src/Gui/Widgets/Editors/ItemEditor.cs:112 src/Gui/Widgets/ItemInfo.cs:374 msgid "Keywords" msgstr "" #: src/Gui/Widgets/Editors/AudioTrackItemEditor.cs:31 #: src/Gui/Widgets/SearchResultView.cs:34 msgid "Audio CD track" msgstr "" #: src/Gui/Widgets/Editors/AudioTrackItemEditor.cs:54 #: src/Gui/Widgets/ItemInfo.cs:230 msgid "Type" msgstr "" #: src/Gui/Widgets/Editors/DirectoryItemEditor.cs:28 msgid "Directory" msgstr "" #: src/Gui/Widgets/Editors/FileSystemItemEditor.cs:59 #: src/Gui/Widgets/SearchResultView.cs:31 src/Gui/Widgets/ItemInfo.cs:183 msgid "Location" msgstr "" #: src/Gui/Widgets/Editors/FileSystemItemEditor.cs:60 #: src/Gui/Widgets/ItemInfo.cs:185 msgid "Last write time" msgstr "" #: src/Gui/Widgets/Editors/FileSystemItemEditor.cs:61 #: src/Gui/Widgets/ItemInfo.cs:210 msgid "Filetype" msgstr "" #: src/Gui/Widgets/Editors/FileItemEditor.cs:31 msgid "File" msgstr "" #: src/Gui/Widgets/Editors/FileItemEditor.cs:52 #: src/Gui/Widgets/ItemInfo.cs:204 src/Gui/Widgets/ItemInfo.cs:226 #: src/Gui/DriveSelection.cs:148 msgid "Size" msgstr "Størrelse" #: src/Gui/Widgets/Editors/FileItemEditor.cs:53 #: src/Gui/Widgets/ItemInfo.cs:206 msgid "Hash" msgstr "" #: src/Gui/Widgets/Editors/AudioCdVolumeEditor.cs:33 msgid "Audio CD" msgstr "" #: src/Gui/Widgets/Editors/AudioCdVolumeEditor.cs:63 msgid "Tracks:" msgstr "" #: src/Gui/Widgets/Editors/AudioCdVolumeEditor.cs:64 msgid "Duration:" msgstr "" #: src/Gui/Widgets/Editors/VolumeEditor.cs:45 msgid "Backup" msgstr "Backup" #: src/Gui/Widgets/Editors/VolumeEditor.cs:46 #: src/Gui/Widgets/CategoryView.cs:60 msgid "Documents" msgstr "Dokumenter" #: src/Gui/Widgets/Editors/VolumeEditor.cs:47 #: src/Gui/Widgets/CategoryView.cs:61 msgid "Music" msgstr "Musik" #: src/Gui/Widgets/Editors/VolumeEditor.cs:48 msgid "Audiobooks" msgstr "" #: src/Gui/Widgets/Editors/VolumeEditor.cs:49 #: src/Gui/Widgets/CategoryView.cs:62 msgid "Movies" msgstr "Film" #: src/Gui/Widgets/Editors/VolumeEditor.cs:50 msgid "Videos" msgstr "" #: src/Gui/Widgets/Editors/VolumeEditor.cs:51 msgid "Pictures" msgstr "Billeder" #: src/Gui/Widgets/Editors/VolumeEditor.cs:52 msgid "Games" msgstr "" #: src/Gui/Widgets/Editors/VolumeEditor.cs:53 src/Gui/Widgets/ItemInfo.cs:319 msgid "Software" msgstr "" #: src/Gui/Widgets/Editors/VolumeEditor.cs:54 msgid "Misc" msgstr "Diverse" #: src/Gui/Widgets/Editors/VolumeEditor.cs:55 msgid "Other" msgstr "Andet" #: src/Gui/Widgets/Editors/VolumeEditor.cs:225 msgid "Yes" msgstr "Ja" #: src/Gui/Widgets/Editors/VolumeEditor.cs:225 msgid "No" msgstr "Nej" #: src/Gui/Widgets/Editors/VolumeEditor.cs:235 msgid "Volume type:" msgstr "Volume type:" #: src/Gui/Widgets/Editors/VolumeEditor.cs:236 msgid "Hashed:" msgstr "Hashed:" #: src/Gui/Widgets/Editors/VolumeEditor.cs:237 msgid "Added:" msgstr "Tilføjet:" #: src/Gui/Widgets/Editors/VolumeEditor.cs:258 msgid "Archive No.:" msgstr "" #: src/Gui/Widgets/Editors/VolumeEditor.cs:260 msgid "Title:" msgstr "Titel:" #: src/Gui/Widgets/Editors/VolumeEditor.cs:261 src/Gui/DBProperties.cs:98 msgid "Description:" msgstr "Beskrivelse:" #: src/Gui/Widgets/Editors/VolumeEditor.cs:262 msgid "Keywords:" msgstr "Nøgleord:" #: src/Gui/Widgets/Editors/VolumeEditor.cs:263 msgid "Loaned to:" msgstr "Lånt til:" #: src/Gui/Widgets/Editors/VolumeEditor.cs:264 msgid "Loaned date:" msgstr "Lånedato:" #: src/Gui/Widgets/Editors/VolumeEditor.cs:265 msgid "Return date:" msgstr "Retur dato:" #: src/Gui/Widgets/CategoryView.cs:58 msgid "Directories" msgstr "" #: src/Gui/Widgets/CategoryView.cs:59 msgid "Text" msgstr "" #: src/Gui/Widgets/CategoryView.cs:63 msgid "Images" msgstr "" #: src/Gui/Widgets/CategoryView.cs:64 msgid "Applications" msgstr "" #: src/Gui/Widgets/CategoryView.cs:65 msgid "Archives" msgstr "" #: src/Gui/Widgets/CategoryView.cs:66 msgid "Development" msgstr "" #: src/Gui/Widgets/CategoryView.cs:96 src/Gui/MainWindow.cs:1046 msgid "Category" msgstr "" #: src/Gui/Widgets/CategoryView.cs:128 msgid "All items" msgstr "" #: src/Gui/Widgets/SearchResultView.cs:32 msgid "Volume" msgstr "" #: src/Gui/Widgets/SearchResultView.cs:33 src/Gui/MainWindow.cs:1040 msgid "Archive No." msgstr "" #: src/Gui/Widgets/ItemInfo.cs:40 msgid "by" msgstr "" #: src/Gui/Widgets/ItemInfo.cs:41 msgid "from" msgstr "" #: src/Gui/Widgets/ItemInfo.cs:196 msgid "Symlink target" msgstr "" #: src/Gui/Widgets/ItemInfo.cs:227 msgid "Track No." msgstr "" #: src/Gui/Widgets/ItemInfo.cs:258 msgid "Genre" msgstr "" #: src/Gui/Widgets/ItemInfo.cs:278 msgid "Year" msgstr "" #: src/Gui/Widgets/ItemInfo.cs:283 msgid "Description" msgstr "" #: src/Gui/Widgets/ItemInfo.cs:294 msgid "Dimensions" msgstr "" #: src/Gui/Widgets/ItemInfo.cs:299 msgid "Format" msgstr "" #: src/Gui/Widgets/ItemInfo.cs:303 msgid "Author" msgstr "" #: src/Gui/Widgets/ItemInfo.cs:307 msgid "Copyright" msgstr "" #: src/Gui/Widgets/ItemInfo.cs:311 msgid "Producer" msgstr "" #: src/Gui/Widgets/ItemInfo.cs:315 msgid "Creator" msgstr "" #: src/Gui/Widgets/ItemInfo.cs:323 msgid "Language" msgstr "" #: src/Gui/Widgets/ItemInfo.cs:327 msgid "Page count" msgstr "" #: src/Gui/Widgets/ItemInfo.cs:346 msgid "File count" msgstr "" #: src/Gui/Widgets/PageNavigation.cs:27 msgid "No items." msgstr "" #: src/Gui/Widgets/PageNavigation.cs:145 #, csharp-format msgid "Page {0}/{1} ({2} - {3} of {4} items)" msgstr "" #: src/Gui/ObjectProperties.cs:54 src/Gui/VolumeScanner.cs:248 msgid "Invalid data" msgstr "Ugyldige data" #: src/Gui/ObjectProperties.cs:54 src/Gui/VolumeScanner.cs:249 #, csharp-format msgid "" "\"{0}\" is {1}.\n" "\n" "Expected format: {2}\n" "Please correct or remove the data you entered." msgstr "" "\"{0}\" is {1}.\n" "\n" "Forventet format: {2}\n" "Ret venligst eller fjern de data du indtastede." #: src/Gui/DBProperties.cs:85 msgid "Database Properties" msgstr "Database egenskaber" #: src/Gui/DBProperties.cs:97 msgid "Name:" msgstr "Navn:" #: src/Gui/DBProperties.cs:99 msgid "Created:" msgstr "Oprettet:" #: src/Gui/VolumeProperties.cs:29 msgid "Volume Properties" msgstr "Volume rettigheder" #: src/Gui/DriveSelection.cs:60 msgid "Waiting for drives..." msgstr "Venter på drev..." #: src/Gui/DriveSelection.cs:133 msgid "Drive" msgstr "Drev" #: src/Gui/DriveSelection.cs:139 msgid "Label" msgstr "Mærkat" #: src/Gui/DriveSelection.cs:241 msgid "Please select a drive to scan" msgstr "Vælg venligst et drev til skanning" #: src/Gui/About.cs:28 msgid "A cross-platform media indexing/search tool." msgstr "" #: src/Gui/About.cs:29 #, csharp-format msgid "Using VolumeDB v{0}." msgstr "Bruger VolumeDB v{0}." #: src/Gui/About.cs:31 msgid "Copyright (c) " msgstr "Copyright (c) " #: src/Gui/ItemSearch.cs:81 #, csharp-format msgid "Found {0} items in {1:F3} seconds." msgstr "Fandt {0} emner på {1:F3} sekunder." #: src/Gui/ItemSearch.cs:92 src/Gui/MainWindow.cs:519 msgid "Timeout: another search is probably still in progress." msgstr "Stoppet: en anden søgning pågår sikkert fortsat." #: src/Gui/ItemSearch.cs:94 msgid "Too many search results. Please refine your search criteria." msgstr "" #: src/Gui/ItemSearch.cs:112 src/Gui/MainWindow.cs:535 msgid "Searching..." msgstr "Søger..." #: src/Gui/ItemSearch.cs:267 msgid "Search Items" msgstr "Søge emner" #: src/Gui/ItemSearch.cs:279 src/Gui/MainWindow.cs:1145 msgid "default" msgstr "" #: src/Gui/ItemSearch.cs:283 msgid "Search items" msgstr "" #: src/Gui/ItemSearch.cs:318 msgid "Quick tip:" msgstr "" #: src/Gui/ItemSearch.cs:319 #, csharp-format msgid "" "Click on the icon to the left of the search field to build advanced search " "queries.\n" "Example: {0}" msgstr "" #: src/Gui/ItemSearch.cs:326 msgid "No search results." msgstr "" #: src/Gui/ItemSearch.cs:375 src/Gui/MainWindow.cs:1028 msgid "Edit Item" msgstr "" #: src/Gui/ItemSearch.cs:382 msgid "Show in Main Window" msgstr "" #: src/Gui/MainWindow.cs:77 src/Gui/MainWindow.cs:93 src/Gui/MainWindow.cs:635 #, csharp-format msgid "Database '{0}' not found." msgstr "Database '{0}' ikke fundet." #: src/Gui/MainWindow.cs:185 msgid "Database not found" msgstr "" #: src/Gui/MainWindow.cs:186 msgid "Default database not found. Create?" msgstr "" #: src/Gui/MainWindow.cs:215 msgid "Unsupported database version" msgstr "Ikke understøttet databaseversion" #: src/Gui/MainWindow.cs:216 msgid "This database version is not supported." msgstr "Denne databaseversion ikke understøttet." #: src/Gui/MainWindow.cs:235 #, csharp-format msgid "{0} volumes loaded." msgstr "{0} volumes indlæst." #: src/Gui/MainWindow.cs:256 #, csharp-format msgid "An error occured while loading the volume list: {0}" msgstr "" #: src/Gui/MainWindow.cs:300 msgid "Please enter the name for the new database" msgstr "Indtast venligst navnet på den nye database" #: src/Gui/MainWindow.cs:312 msgid "Database exists" msgstr "Databasen findes allerede" #: src/Gui/MainWindow.cs:313 msgid "Database already exists. Overwrite?" msgstr "Databasen findes allerede. Overskriv?" #: src/Gui/MainWindow.cs:326 msgid "Please select a database" msgstr "Vælg venligst en database" #: src/Gui/MainWindow.cs:335 src/Gui/Import.cs:83 msgid "Database not found." msgstr "Databasen blev ikke fundet." #: src/Gui/MainWindow.cs:356 #, csharp-format msgid "" "An error occured while accessing drive {0}:\n" "{1}" msgstr "" "En fejl opstod under adgang til drev {0}:\n" "{1}" #: src/Gui/MainWindow.cs:378 #, csharp-format msgid "Drive {0} is not ready." msgstr "Drev {0} ikke klar." #: src/Gui/MainWindow.cs:387 #, csharp-format msgid "Drive {0} is neither mounted nor does it contain an audio cd." msgstr "" #: src/Gui/MainWindow.cs:406 msgid "Confirmation" msgstr "Bekræftelse" #: src/Gui/MainWindow.cs:407 msgid "Are you sure you really want to remove the selected volume?" msgstr "Er du sikker på at du virkelig vil fjerne den valgte volume?" #: src/Gui/MainWindow.cs:712 #, csharp-format msgid "Please insert volume '{0}'." msgstr "" #: src/Gui/MainWindow.cs:714 msgid "Waiting for volume" msgstr "" #: src/Gui/MainWindow.cs:966 msgid "Add Volume" msgstr "" #: src/Gui/MainWindow.cs:970 msgid "Search" msgstr "" #: src/Gui/MainWindow.cs:973 msgid "App Menu" msgstr "" #: src/Gui/MainWindow.cs:979 msgid "_New Database" msgstr "_Ny database" #: src/Gui/MainWindow.cs:982 msgid "_Open Database" msgstr "_Åben database" #: src/Gui/MainWindow.cs:985 msgid "Open Default Database" msgstr "" #: src/Gui/MainWindow.cs:991 msgid "Recent Databases" msgstr "" #: src/Gui/MainWindow.cs:998 msgid "_Import" msgstr "" #: src/Gui/MainWindow.cs:1001 msgid "_Preferences" msgstr "_Indstillinger" #: src/Gui/MainWindow.cs:1004 msgid "_Database Properties" msgstr "_Database rettigheder" #: src/Gui/MainWindow.cs:1007 msgid "Info" msgstr "" #: src/Gui/MainWindow.cs:1010 msgid "_Quit" msgstr "_Afslut" #: src/Gui/MainWindow.cs:1016 msgid "_Edit Volume" msgstr "" #: src/Gui/MainWindow.cs:1019 msgid "_Remove Volume" msgstr "_Fjer Volume" #: src/Gui/MainWindow.cs:1022 msgid "Rescan Volume" msgstr "" #: src/Gui/MainWindow.cs:1034 msgid "Sort by" msgstr "" #: src/Gui/MainWindow.cs:1037 msgid "Descending" msgstr "" #: src/Gui/MainWindow.cs:1043 msgid "Date added" msgstr "" #: src/Gui/MainWindow.cs:1044 msgid "Title" msgstr "" #: src/Gui/MainWindow.cs:1045 msgid "Drivetype" msgstr "" #: src/Gui/MainWindow.cs:1142 msgid "Filter volumes" msgstr "" #: src/Gui/Import.cs:29 msgid "Import" msgstr "" #: src/Gui/Import.cs:30 msgid "Abort" msgstr "" #: src/Gui/Import.cs:31 msgid "Please select a database." msgstr "" #: src/Gui/Import.cs:72 #, csharp-format msgid "{0:0}% completed." msgstr "" #: src/Gui/Import.cs:82 msgid "Import failed" msgstr "" #: src/Gui/Import.cs:85 msgid "Import failed!" msgstr "" #: src/Gui/Import.cs:87 msgid "Import aborted." msgstr "" #: src/Gui/Import.cs:89 msgid "Import completed successfully." msgstr "" #: src/Gui/Import.cs:121 msgid "Import in progress" msgstr "" #: src/Gui/Import.cs:122 msgid "You must stop the import before closing this window." msgstr "" #: src/Gui/Import.cs:148 msgid "Unknown format." msgstr "" #: src/Gui/Import.cs:175 msgid "Import Database" msgstr "" #: src/Gui/Import.cs:186 msgid "Please select a database to import" msgstr "" #: src/Gui/Import.cs:194 msgid "All supported formats" msgstr "" #: src/Gui/Import.cs:198 #, csharp-format msgid ".{0} files" msgstr "" #: src/Gui/Import.cs:209 msgid "Database:" msgstr "" #: src/Gui/Import.cs:210 msgid "Format:" msgstr "" #: src/Gui/ItemProperties.cs:29 msgid "Item Properties" msgstr "" #: src/Gui/VolumeScanner.cs:116 msgid "Scanning started." msgstr "" #: src/Gui/VolumeScanner.cs:118 #, csharp-format msgid "Scanning of drive '{0}' started." msgstr "" #: src/Gui/VolumeScanner.cs:124 #, csharp-format msgid "" "Options: generate thumbs: {0}, extract metadata: {1}, discard symlinks: {2}, " "hashing: {3}." msgstr "" #: src/Gui/VolumeScanner.cs:131 #, csharp-format msgid "Options: MusicBrainz enabled: {0}" msgstr "" #: src/Gui/VolumeScanner.cs:157 msgid "Time" msgstr "Tid" #: src/Gui/VolumeScanner.cs:161 msgid "Message" msgstr "Meddelelse" #: src/Gui/VolumeScanner.cs:258 msgid "Stopping Scanner and performing rollback..." msgstr "Stopper skanning og ruller tilbage..." #: src/Gui/VolumeScanner.cs:268 msgid "yes" msgstr "ja" #: src/Gui/VolumeScanner.cs:268 msgid "no" msgstr "nej" #: src/Gui/VolumeScanner.cs:291 msgid "Scan in progress" msgstr "Skanning pågår" #: src/Gui/VolumeScanner.cs:291 msgid "You must stop scanning before closing this window." msgstr "Du skal stoppe skanning før du lukker vinduet." #: src/Gui/VolumeScanner.cs:346 #, csharp-format msgid "An unhandled exception occured ({0})." msgstr "En uventet undtagelse opstod ({0})." #: src/Gui/VolumeScanner.cs:347 msgid "All database changes have been rolled back." msgstr "Alle databaseændringer er rullet tilbage." #: src/Gui/VolumeScanner.cs:354 #, csharp-format msgid "Scanning failed. Reason: an unhandled exception occured ({0})." msgstr "Skanning mislykkedes. Årsag: En uventet undtagelse opstod ({0})." #: src/Gui/VolumeScanner.cs:356 msgid "Scanning aborted." msgstr "Skanning afbrudt" #: src/Gui/VolumeScanner.cs:358 msgid "Scanning completed successfully." msgstr "Skanning gennemført med succes." #: src/Gui/VolumeScanner.cs:488 msgid "VolumeScanner" msgstr "Volumen skanner" #: src/Gui/VolumeScanner.cs:500 msgid "Volume Information:" msgstr "Volume Information:" #: src/Gui/VolumeScanner.cs:510 msgid "Scanner Log:" msgstr "Skanningslog:" #: src/Gui/VolumeScanner.cs:527 msgid "Database access" msgstr "Database adgang" #: src/Gui/Preferences.cs:119 msgid "None" msgstr "Ingen" #: src/Gui/Preferences.cs:228 msgid "Unsupported theme" msgstr "" #: src/Gui/Preferences.cs:229 msgid "The selected icon theme is currently not supported on your system." msgstr "" #: src/Gui/Preferences.cs:267 msgid "Restart required" msgstr "Genstart påkrævet" #: src/Gui/Preferences.cs:268 #, csharp-format msgid "You must restart {0} for icontheme changes to take effect." msgstr "" #: src/Gui/Preferences.cs:298 msgid "Preferences" msgstr "Indstillinger" #: src/Gui/Preferences.cs:322 msgid "_Load Defaults" msgstr "_Indlæs standardindstillinger" #: src/Gui/Preferences.cs:349 msgid "Icon theme:" msgstr "Ikon tema:" #: src/Gui/Preferences.cs:355 msgid "Reopen most recent database on startup" msgstr "Genåben den seneste database ved start" #: src/Gui/Preferences.cs:359 msgid "Show iteminfo panel" msgstr "" #: src/Gui/Preferences.cs:363 msgid "Show hidden files" msgstr "" #: src/Gui/Preferences.cs:367 msgid "Show thumbnails in the filebrowser" msgstr "" #: src/Gui/Preferences.cs:370 msgid "General" msgstr "Generelt" #: src/Gui/Preferences.cs:378 msgid "Don't prompt, always scan:" msgstr "" #: src/Gui/Preferences.cs:397 msgid "Generate Thumbnails" msgstr "" #: src/Gui/Preferences.cs:401 msgid "Extract metadata" msgstr "" #: src/Gui/Preferences.cs:405 msgid "Discard symbolic links" msgstr "" #: src/Gui/Preferences.cs:409 msgid "Compute hashcodes for files (slow!)" msgstr "" #: src/Gui/Preferences.cs:413 msgid "Fetch audio cd metadata from MusicBrainz.org" msgstr "" #: src/Gui/Preferences.cs:416 msgid "Scanner" msgstr "Skanner" Basenji/po/de.resources0000664000175000017500000003612612067326706015272 0ustar patrickpatricklSystem.Resources.ResourceReader, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089#System.Resources.RuntimeResourceSetPADPADP̯[\ĒZFn_`/+ܽێyB_2 bJ䗖x~?ޘi ǚ˚}朮G  +Iљ,ޠ}ѬX`pѨE7kxbݏѝ!峸/# *?8 ڻMo;,锼xb5x,QoċƵgsv59}΍\$о DaрO51 թ}&ٍɬڴn^/gk䷧ 4pz$dF>?y7 Taq;͈nYDoY`rYrY$sYsYStYj~Ԕx06ez Z P4 * J  o> 8a c iz $ |q c  O\mg:a}AKuQ>R j!ز$&P%%**U++,Q-SP.1;v9`9vE:Iu:>Y@;CBsDHI1L2Q;RfMSMeS@STXmޡY![[Page {0}/{1}</b> ({2} - {3} of {4} items) &<b>Scanner Log:</b>B4<b>Volume Information:</b>WXA cross-platform media indexing/search tool.{ AbortAdd Volume Added:VAll database changes have been rolled back.All files(All items6*All supported formatsE^An error occured while accessing drive {0}: {1}bfAn error occured while loading the volume list: {0}JAn unhandled exception occured ({0}).App MenuApplications&Archive No.1Archive No.:=ArchivesJvAre you sure you really want to remove the selected volume?S ArtistAudio CDAudio CD trackAudiobooks Author Backup BytesCategoryCategory:Click on the icon to the left of the search field to build advanced search queries. Example: {0}FCompute hashcodes for files (slow!)jConfirmationCopyrightCopyright (c) Created:Creator2Database '{0}' not found.&Database PropertiesDatabase accessFDatabase already exists. Overwrite?-Database exists_$Database not found|&Database not found.Database:Date addedFDefault database not found. Create?Descending Description,Description::DevelopmentIDimensionsVDirectoriescDirectories:rDirectory,Discard symbolic linksDocuments4Don't prompt, always scan: DrivezDrive {0} is neither mounted nor does it contain an audio cd..Drive {0} is not ready.#DrivetypeGDurationTDuration:\Edit Iteme Errory Extract metadataXFetch audio cd metadata from MusicBrainz.orgFileFile count Files:FilesystemFiletypeFilter volumes Format Format: DFound {0} items in {1:F3} seconds.' GBR GamesV General^ &Generate Thumbnailsi Genre Hash Hashed: Icon theme: Images Import Import Database Import aborted. {0}</b>'. 0Please select a database DPlease select a database to import 2Please select a database.6 :Please select a drive to scanY Preferences Producer Quick tip: Recent Databases LReopen most recent database on startup Rescan Volume Restart required Return date:# Scan in progress4ScannerI"Scanning aborted.R@Scanning completed successfully.l|Scanning failed. Reason: an unhandled exception occured ({0}).@Scanning of drive '{0}' started."Scanning started. Search(Search Items0Search itemsASearching...R"Show hidden files\&Show in Main Windowy&Show iteminfo panelDShow thumbnails in the filebrowserSizeSoftwareSort byVStopping Scanner and performing rollback...Symlink target"TB0Text4The selected icon theme is currently not supported on your system.:NThis database version is not supported.TimelTimeout: another search is probably still in progress. Title Title: xToo many search results. Please refine your search criteria.Total size:VTrack No.fTracks:qTypezUnknownUnknown format.Unnamed8Unsupported database version"Unsupported theme(Using VolumeDB v{0}. Videos Volume "Volume PropertiesVolume type:5(VolumeDatabase filesGVolumeScanner_*Waiting for drives...n$Waiting for volumeYearYestYou must restart {0} for icontheme changes to take effect.dYou must stop scanning before closing this window.hYou must stop the import before closing this window.F(_Database Properties_Edit Volume_Import_Load Defaults_New Database_Open Database_Preferences _Quit*_Remove Volume3byLdefaultQ files[fromdnoi tracksoyesw"{0:0}% completed.{{0} Bytes.{0} is already running.&{0} volumes loaded.Project-Id-Version: basenji Report-Msgid-Bugs-To: FULL NAME POT-Creation-Date: 2012-07-15 15:49+0200 PO-Revision-Date: 2012-07-15 14:13+0000 Last-Translator: Patrick Ulbrich Language-Team: German MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Launchpad-Export-Date: 2012-10-27 11:00+0000 X-Generator: Launchpad (build 16194) Z"{0}" ist {1}. Erwartetes Format: {2} Bitte korrigieren oder entfernen Sie Ihre Eingaben.(leer) .{0} Dateien3Seite {0}/{1} ({2} - {3} von {4} Elementen)Scanner Log:"Datenträger Informationen:EEin plattformübergreifendes Datenträger Indizierungs-/Suchwerkzeug. AbbrechenDatenträger hinzufügen Hinzugefügt:0Alle Datenbankänderungen wurden zurückgerollt. Alle Dateien Alle ElementeAlle unterstützten Formate:Ein Fehler trat beim Zugriff auf das Laufwerk {0} auf: {1}JEin Fehler ist während des Ladens der Datenträger-Liste aufgetreten: {0}/Ein unbehandelter Fehler ist aufgetreten ({0}). App-Menü Programme Archiv-Nr. Archiv-Nr.:ArchiveRSind Sie wirklich sicher, dass sie den gewählten Datenträger entfernen möchten? InterpretAudio-CDAudio-CD Track HörbücherAutorBackupBytes Kategorie Kategorie:bKlicken Sie auf das Icon links vom Suchfeld um erweiterte Suchanfragen zu erstellen. Beispiel: {0}+Hashcodes für Dateien berechnen (langsam!) Bestätigung UrheberrechtCopyright (c)  Erstellt am:Erzeuger%Datenbank '{0}' wurde nicht gefunden.Datenbank-EigenschaftenDatenbankzugriff0Die Datenbank existiert bereits. Überschreiben?Datenbank existiert bereitsDatenbank wurde nicht gefunden#Die Datenbank wurde nicht gefunden. Datenbank:Hinzufüge-Datum?Die Standard-Datenbank konnte nicht gefunden werden. Erstellen? Absteigend Beschreibung Beschreibung: Entwicklung Abmessungen VerzeichnisseVerzeichnisse: VerzeichnisSymbolische Links verwerfen DokumenteScanne immer ohne zu fragen:LaufwerkBLaufwerk {0} ist weder eingehängt noch enthält es eine Audio-CD."Das Laufwerk {0} ist nicht bereit. LaufwerktypLängeLänge:Element bearbeitenFehlerMetadaten extrahieren.Audio-CD Metadaten von MusicBrainz.org abrufenDateiAnzahl DateienDateien: DateisystemDateitypDatenträger filternFormatFormat:){0} Elemente in {1:F3} Sekunden gefunden.GBSpiele AllgemeinThumbnails generierenGenreHashGehasht: Icon-Thema:Bilder ImportierenDatenbank importierenImportieren abgebrochen.&Importieren erfolgreich abgeschlossen.Importieren fehlgeschlagenImportieren fehlgeschlagen!Importvorgang läuftÜberUngültige DatenElement-Eigenschaften Element-TypKBSchlüsselwörter Stichwörter: BezeichnungSprache GeändertLadevorgang… Verleihdatum: Verliehen an:OrtMBMeldung VerschiedenesFilmeMusikNameName:NeinKeine Elemente.Keine Suchergebnisse.KeinesNotizStandard-Datenbank öffnen OptionsName Optionen: MusicBrainz aktiv: {0}}Optionen: Thumbnails generieren: {0}, Metadaten extrahieren: {1}, symbolische Links verwerfen: {2}, Hashcodes berechnen: {3}. Sonstiges Anzahl SeitenFotos1Bitte geben Sie den Namen der neuen Datenbank ein2Bitte legen Sie den Datenträger '{0}' ein. Bitte wählen Sie eine Datenbank4Bitte wählen Sie eine Datenbank zum Importieren aus!Bitte wählen Sie eine Datenbank.)Bitte wählen Sie ein Lauwerk zum Scannen Einstellungen Hersteller Heißer Tipp:Letzte Datenbanken-Zuletzt geöffnete Datenbank beim Start ladenDatenträger neu einlesenNeustart erforderlichRückgabedatum:Aktiver ScanvorgangScannerScanvorgang abgebrochen. Scanvorgang erfolgreich beendet.TScanvorgang fehlgeschlagen. Ursache: Ein unbehandelter Fehler ist aufgetreten ({0}).*Scanvorgang für Laufwerk '{0}' gestartet.Scanvorgang gestartet.SuchenElemente suchenElemente suchenSuche...Versteckte Dateien anzeigenIm Hauptfenster anzeigenItemInfo-Leiste anzeigen#Thumbnails im Dateibrowser anzeigenGrößeSoftwareSortieren nach+Stoppe Scanner und führe Rollback durch... SymLink-ZielTBTextKDas gewählte Icon-Thema wird momentan nicht auf Ihrem System unterstützt..Diese Datenbankversion wird nicht untersützt.ZeitEZeitüberschreitung: Vermutlich läuft noch ein weiterer Suchvorgang.TitelTitel:AZu viele Suchergebnisse. Bitte verfeinern Sie Ihre Suchkriterien.Gesamtgröße: Track-Nr.Tracks:Typ UnbekanntUnbekanntes Format. Unbenannt$Nicht unterstützte DatenbankversionThema nicht unterstütztVerwende VolumeDB v{0}.Videos DatenträgerDatenträger-EigenschaftenDatenträgertyp:VolumeDatabase Dateien VolumeScannerWarte auf Laufwerke...Warte auf DatenträgerJahrJaPSie müssen {0} neustarten, damit die Änderungen des Iconthemas wirksam werden.JSie müssen den Scanvorgang abbrechen bevor Sie dieses Fenster schließen.YSie müssen den Importier-Vorgang abbrechen, bevor Sie dieses Fenster schließen können.Datenbank-EigenschaftenDatenträger bearbeiten _ImportierenStandardwerte _laden_Neue DatenbankDatenbank öffnen EinstellungenBeendenDatenträger entfe_rnenvonstandardDateienausneinTracksja{0:0}% abgeschlossen. {0} Bytes{0} läuft bereits.{0} Datenträger geladen.Basenji/po/hr.po0000664000175000017500000005127112067326706013715 0ustar patrickpatrick# Croatian translation for basenji # Copyright (c) 2011 Rosetta Contributors and Canonical Ltd 2011 # This file is distributed under the same license as the basenji package. # FIRST AUTHOR , 2011. # msgid "" msgstr "" "Project-Id-Version: basenji\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2012-07-15 15:49+0200\n" "PO-Revision-Date: 2012-09-29 08:42+0000\n" "Last-Translator: freedomrun \n" "Language-Team: Croatian \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2012-10-27 11:00+0000\n" "X-Generator: Launchpad (build 16194)\n" #: src/Util.cs:30 #, csharp-format msgid "{0} Bytes" msgstr "{0} Bajtova" #: src/Util.cs:32 msgid "Bytes" msgstr "Bajtovi" #: src/Util.cs:32 msgid "KB" msgstr "KB" #: src/Util.cs:32 msgid "MB" msgstr "MB" #: src/Util.cs:32 msgid "GB" msgstr "GB" #: src/Util.cs:32 msgid "TB" msgstr "TB" #: src/Options.cs:477 msgid "OptionName" msgstr "ImaOpcije" #: src/FileDialog.cs:51 msgid "VolumeDatabase files" msgstr "VolumeDatabase datoteke" #: src/FileDialog.cs:56 msgid "All files" msgstr "Sve datoteke" #: src/Main.cs:142 src/Gui/MainWindow.cs:76 src/Gui/MainWindow.cs:92 #: src/Gui/MainWindow.cs:334 src/Gui/MainWindow.cs:355 #: src/Gui/MainWindow.cs:377 src/Gui/MainWindow.cs:386 #: src/Gui/MainWindow.cs:635 msgid "Error" msgstr "Greška" #: src/Main.cs:142 #, csharp-format msgid "{0} is already running." msgstr "{0} je već pokrenut." #: src/Gui/Widgets/VolumeView.cs:42 src/Gui/Widgets/SearchResultView.cs:30 msgid "Unnamed" msgstr "Neimenovano" #: src/Gui/Widgets/VolumeView.cs:43 #: src/Gui/Widgets/Editors/VolumeEditor.cs:259 msgid "Category:" msgstr "Kategorija:" #: src/Gui/Widgets/VolumeView.cs:44 msgid "files" msgstr "datoteke" #: src/Gui/Widgets/VolumeView.cs:45 msgid "tracks" msgstr "pjesme" #: src/Gui/Widgets/ItemView.cs:29 msgid "Loading..." msgstr "Učitavanje…" #: src/Gui/Widgets/ItemView.cs:30 msgid "(empty)" msgstr "(prazno)" #: src/Gui/Widgets/ItemView.cs:99 src/Gui/DriveSelection.cs:80 msgid "Unknown" msgstr "Nepoznato" #: src/Gui/Widgets/ItemView.cs:170 src/Gui/Widgets/Editors/ItemEditor.cs:96 msgid "Name" msgstr "Naziv" #: src/Gui/Widgets/ItemView.cs:176 msgid "Artist" msgstr "Umjetnik/ca" #: src/Gui/Widgets/ItemView.cs:181 #: src/Gui/Widgets/Editors/AudioTrackItemEditor.cs:53 #: src/Gui/Widgets/ItemInfo.cs:225 src/Gui/Widgets/ItemInfo.cs:288 msgid "Duration" msgstr "Trajanje" #: src/Gui/Widgets/Editors/FileSystemVolumeEditor.cs:34 #: src/Gui/DriveSelection.cs:168 msgid "Filesystem" msgstr "Datotečni sustav" #: src/Gui/Widgets/Editors/FileSystemVolumeEditor.cs:65 msgid "Files:" msgstr "Datoteke:" #: src/Gui/Widgets/Editors/FileSystemVolumeEditor.cs:66 msgid "Directories:" msgstr "Mape:" #: src/Gui/Widgets/Editors/FileSystemVolumeEditor.cs:67 msgid "Total size:" msgstr "Ukupna veličina:" #: src/Gui/Widgets/Editors/ItemEditor.cs:95 msgid "Item type" msgstr "Vrsta stavke" #: src/Gui/Widgets/Editors/ItemEditor.cs:111 src/Gui/Widgets/ItemInfo.cs:371 msgid "Note" msgstr "Napomena" #: src/Gui/Widgets/Editors/ItemEditor.cs:112 src/Gui/Widgets/ItemInfo.cs:374 msgid "Keywords" msgstr "Ključne riječi" #: src/Gui/Widgets/Editors/AudioTrackItemEditor.cs:31 #: src/Gui/Widgets/SearchResultView.cs:34 msgid "Audio CD track" msgstr "AudioCD pjesma" #: src/Gui/Widgets/Editors/AudioTrackItemEditor.cs:54 #: src/Gui/Widgets/ItemInfo.cs:230 msgid "Type" msgstr "Vrsta" #: src/Gui/Widgets/Editors/DirectoryItemEditor.cs:28 msgid "Directory" msgstr "Mapa" #: src/Gui/Widgets/Editors/FileSystemItemEditor.cs:59 #: src/Gui/Widgets/SearchResultView.cs:31 src/Gui/Widgets/ItemInfo.cs:183 msgid "Location" msgstr "Lokacija" #: src/Gui/Widgets/Editors/FileSystemItemEditor.cs:60 #: src/Gui/Widgets/ItemInfo.cs:185 msgid "Last write time" msgstr "Vrijeme zadnjeg pisanja" #: src/Gui/Widgets/Editors/FileSystemItemEditor.cs:61 #: src/Gui/Widgets/ItemInfo.cs:210 msgid "Filetype" msgstr "Vrsta datoteke" #: src/Gui/Widgets/Editors/FileItemEditor.cs:31 msgid "File" msgstr "Datoteka" #: src/Gui/Widgets/Editors/FileItemEditor.cs:52 #: src/Gui/Widgets/ItemInfo.cs:204 src/Gui/Widgets/ItemInfo.cs:226 #: src/Gui/DriveSelection.cs:148 msgid "Size" msgstr "Veličina" #: src/Gui/Widgets/Editors/FileItemEditor.cs:53 #: src/Gui/Widgets/ItemInfo.cs:206 msgid "Hash" msgstr "Hash" #: src/Gui/Widgets/Editors/AudioCdVolumeEditor.cs:33 msgid "Audio CD" msgstr "Audio CD" #: src/Gui/Widgets/Editors/AudioCdVolumeEditor.cs:63 msgid "Tracks:" msgstr "Pjesme:" #: src/Gui/Widgets/Editors/AudioCdVolumeEditor.cs:64 msgid "Duration:" msgstr "Trajanje:" #: src/Gui/Widgets/Editors/VolumeEditor.cs:45 msgid "Backup" msgstr "Sigurnosna kopija" #: src/Gui/Widgets/Editors/VolumeEditor.cs:46 #: src/Gui/Widgets/CategoryView.cs:60 msgid "Documents" msgstr "Dokumenti" #: src/Gui/Widgets/Editors/VolumeEditor.cs:47 #: src/Gui/Widgets/CategoryView.cs:61 msgid "Music" msgstr "Glazba" #: src/Gui/Widgets/Editors/VolumeEditor.cs:48 msgid "Audiobooks" msgstr "Glazbene knjige" #: src/Gui/Widgets/Editors/VolumeEditor.cs:49 #: src/Gui/Widgets/CategoryView.cs:62 msgid "Movies" msgstr "Filmovi" #: src/Gui/Widgets/Editors/VolumeEditor.cs:50 msgid "Videos" msgstr "Video snimke" #: src/Gui/Widgets/Editors/VolumeEditor.cs:51 msgid "Pictures" msgstr "Fotografije" #: src/Gui/Widgets/Editors/VolumeEditor.cs:52 msgid "Games" msgstr "Igre" #: src/Gui/Widgets/Editors/VolumeEditor.cs:53 src/Gui/Widgets/ItemInfo.cs:319 msgid "Software" msgstr "Software" #: src/Gui/Widgets/Editors/VolumeEditor.cs:54 msgid "Misc" msgstr "Razno" #: src/Gui/Widgets/Editors/VolumeEditor.cs:55 msgid "Other" msgstr "Ostalo" #: src/Gui/Widgets/Editors/VolumeEditor.cs:225 msgid "Yes" msgstr "Da" #: src/Gui/Widgets/Editors/VolumeEditor.cs:225 msgid "No" msgstr "Ne" #: src/Gui/Widgets/Editors/VolumeEditor.cs:235 msgid "Volume type:" msgstr "Vrsta uređaja:" #: src/Gui/Widgets/Editors/VolumeEditor.cs:236 msgid "Hashed:" msgstr "Hashirano:" #: src/Gui/Widgets/Editors/VolumeEditor.cs:237 msgid "Added:" msgstr "Dodano:" #: src/Gui/Widgets/Editors/VolumeEditor.cs:258 msgid "Archive No.:" msgstr "Br. Arhive:" #: src/Gui/Widgets/Editors/VolumeEditor.cs:260 msgid "Title:" msgstr "Naslov:" #: src/Gui/Widgets/Editors/VolumeEditor.cs:261 src/Gui/DBProperties.cs:98 msgid "Description:" msgstr "Opis:" #: src/Gui/Widgets/Editors/VolumeEditor.cs:262 msgid "Keywords:" msgstr "Ključne riječi:" #: src/Gui/Widgets/Editors/VolumeEditor.cs:263 msgid "Loaned to:" msgstr "Posuđeno:" #: src/Gui/Widgets/Editors/VolumeEditor.cs:264 msgid "Loaned date:" msgstr "Datum posudbe:" #: src/Gui/Widgets/Editors/VolumeEditor.cs:265 msgid "Return date:" msgstr "Datum vraćanja:" #: src/Gui/Widgets/CategoryView.cs:58 msgid "Directories" msgstr "Mape" #: src/Gui/Widgets/CategoryView.cs:59 msgid "Text" msgstr "Tekst" #: src/Gui/Widgets/CategoryView.cs:63 msgid "Images" msgstr "Slike" #: src/Gui/Widgets/CategoryView.cs:64 msgid "Applications" msgstr "Aplikacije" #: src/Gui/Widgets/CategoryView.cs:65 msgid "Archives" msgstr "Arhive" #: src/Gui/Widgets/CategoryView.cs:66 msgid "Development" msgstr "Razvoj" #: src/Gui/Widgets/CategoryView.cs:96 src/Gui/MainWindow.cs:1046 msgid "Category" msgstr "Kategorija" #: src/Gui/Widgets/CategoryView.cs:128 msgid "All items" msgstr "Sve stavke" #: src/Gui/Widgets/SearchResultView.cs:32 msgid "Volume" msgstr "Glasnoća" #: src/Gui/Widgets/SearchResultView.cs:33 src/Gui/MainWindow.cs:1040 msgid "Archive No." msgstr "Arhiva No." #: src/Gui/Widgets/ItemInfo.cs:40 msgid "by" msgstr "od" #: src/Gui/Widgets/ItemInfo.cs:41 msgid "from" msgstr "od" #: src/Gui/Widgets/ItemInfo.cs:196 msgid "Symlink target" msgstr "Cilj simboličke veze" #: src/Gui/Widgets/ItemInfo.cs:227 msgid "Track No." msgstr "Br. Pjesme" #: src/Gui/Widgets/ItemInfo.cs:258 msgid "Genre" msgstr "Žanr" #: src/Gui/Widgets/ItemInfo.cs:278 msgid "Year" msgstr "Godina" #: src/Gui/Widgets/ItemInfo.cs:283 msgid "Description" msgstr "Opis" #: src/Gui/Widgets/ItemInfo.cs:294 msgid "Dimensions" msgstr "Dimnezije" #: src/Gui/Widgets/ItemInfo.cs:299 msgid "Format" msgstr "Format" #: src/Gui/Widgets/ItemInfo.cs:303 msgid "Author" msgstr "Autor" #: src/Gui/Widgets/ItemInfo.cs:307 msgid "Copyright" msgstr "Autorsko pravo" #: src/Gui/Widgets/ItemInfo.cs:311 msgid "Producer" msgstr "Producent" #: src/Gui/Widgets/ItemInfo.cs:315 msgid "Creator" msgstr "Stvaralac" #: src/Gui/Widgets/ItemInfo.cs:323 msgid "Language" msgstr "Jezik" #: src/Gui/Widgets/ItemInfo.cs:327 msgid "Page count" msgstr "Broj stranica" #: src/Gui/Widgets/ItemInfo.cs:346 msgid "File count" msgstr "Broj datoteka" #: src/Gui/Widgets/PageNavigation.cs:27 msgid "No items." msgstr "Nema stavki." #: src/Gui/Widgets/PageNavigation.cs:145 #, csharp-format msgid "Page {0}/{1} ({2} - {3} of {4} items)" msgstr "Strana {0}/{1} ({2} - {3} od {4} stavke)" #: src/Gui/ObjectProperties.cs:54 src/Gui/VolumeScanner.cs:248 msgid "Invalid data" msgstr "Nevažeći podaci" #: src/Gui/ObjectProperties.cs:54 src/Gui/VolumeScanner.cs:249 #, csharp-format msgid "" "\"{0}\" is {1}.\n" "\n" "Expected format: {2}\n" "Please correct or remove the data you entered." msgstr "" "\"{0}\" je {1}.\n" "\n" "Treženi format: {2}\n" "Molim ispravite ili izbrišite unesene podatke." #: src/Gui/DBProperties.cs:85 msgid "Database Properties" msgstr "Svojstva databaze" #: src/Gui/DBProperties.cs:97 msgid "Name:" msgstr "Naziv:" #: src/Gui/DBProperties.cs:99 msgid "Created:" msgstr "Izrađeno:" #: src/Gui/VolumeProperties.cs:29 msgid "Volume Properties" msgstr "Svojstva pogona" #: src/Gui/DriveSelection.cs:60 msgid "Waiting for drives..." msgstr "Čekanje pogona..." #: src/Gui/DriveSelection.cs:133 msgid "Drive" msgstr "Pogon" #: src/Gui/DriveSelection.cs:139 msgid "Label" msgstr "Oznaka" #: src/Gui/DriveSelection.cs:241 msgid "Please select a drive to scan" msgstr "Molim odaberite pogon za pretražiti" #: src/Gui/About.cs:28 msgid "A cross-platform media indexing/search tool." msgstr "" #: src/Gui/About.cs:29 #, csharp-format msgid "Using VolumeDB v{0}." msgstr "Korištenje VolumeDB v{0}." #: src/Gui/About.cs:31 msgid "Copyright (c) " msgstr "Copyright (c) " #: src/Gui/ItemSearch.cs:81 #, csharp-format msgid "Found {0} items in {1:F3} seconds." msgstr "Nađeno {0} stavki u {1:F3} sekunde." #: src/Gui/ItemSearch.cs:92 src/Gui/MainWindow.cs:519 msgid "Timeout: another search is probably still in progress." msgstr "Vrijeme isteklo: drugo pretraživanje još u tijeku." #: src/Gui/ItemSearch.cs:94 msgid "Too many search results. Please refine your search criteria." msgstr "Previše rezultata. Prepravite kriterij pretrage." #: src/Gui/ItemSearch.cs:112 src/Gui/MainWindow.cs:535 msgid "Searching..." msgstr "Pretraživanje..." #: src/Gui/ItemSearch.cs:267 msgid "Search Items" msgstr "Pretraži stavke" #: src/Gui/ItemSearch.cs:279 src/Gui/MainWindow.cs:1145 msgid "default" msgstr "zadano" #: src/Gui/ItemSearch.cs:283 msgid "Search items" msgstr "Pretraži stavke" #: src/Gui/ItemSearch.cs:318 msgid "Quick tip:" msgstr "" #: src/Gui/ItemSearch.cs:319 #, csharp-format msgid "" "Click on the icon to the left of the search field to build advanced search " "queries.\n" "Example: {0}" msgstr "" #: src/Gui/ItemSearch.cs:326 msgid "No search results." msgstr "Nema rezultata." #: src/Gui/ItemSearch.cs:375 src/Gui/MainWindow.cs:1028 msgid "Edit Item" msgstr "Izmijeniti stavku" #: src/Gui/ItemSearch.cs:382 msgid "Show in Main Window" msgstr "" #: src/Gui/MainWindow.cs:77 src/Gui/MainWindow.cs:93 src/Gui/MainWindow.cs:635 #, csharp-format msgid "Database '{0}' not found." msgstr "Baza podataka '{0}' nije nađena." #: src/Gui/MainWindow.cs:185 msgid "Database not found" msgstr "Baza podataka nije pronađena" #: src/Gui/MainWindow.cs:186 msgid "Default database not found. Create?" msgstr "Zadana baza podataka nije nađena. Izraditi?" #: src/Gui/MainWindow.cs:215 msgid "Unsupported database version" msgstr "Verzija baze podataka nije podržana" #: src/Gui/MainWindow.cs:216 msgid "This database version is not supported." msgstr "Verzija baze podataka nije podržana." #: src/Gui/MainWindow.cs:235 #, csharp-format msgid "{0} volumes loaded." msgstr "{0} pogona učitano." #: src/Gui/MainWindow.cs:256 #, csharp-format msgid "An error occured while loading the volume list: {0}" msgstr "Greška kod učitavanja popisa pogona: {0}" #: src/Gui/MainWindow.cs:300 msgid "Please enter the name for the new database" msgstr "Upišite ime nove baze podataka" #: src/Gui/MainWindow.cs:312 msgid "Database exists" msgstr "Baza podataka postoji" #: src/Gui/MainWindow.cs:313 msgid "Database already exists. Overwrite?" msgstr "Baza podataka postoji. Prepisati?" #: src/Gui/MainWindow.cs:326 msgid "Please select a database" msgstr "Odaberite bazu podataka." #: src/Gui/MainWindow.cs:335 src/Gui/Import.cs:83 msgid "Database not found." msgstr "Baza podataka nije nađena" #: src/Gui/MainWindow.cs:356 #, csharp-format msgid "" "An error occured while accessing drive {0}:\n" "{1}" msgstr "" "Grška kod pristupanja pogonu {0}:\n" "{1}" #: src/Gui/MainWindow.cs:378 #, csharp-format msgid "Drive {0} is not ready." msgstr "Pogon{0} nije spreman." #: src/Gui/MainWindow.cs:387 #, csharp-format msgid "Drive {0} is neither mounted nor does it contain an audio cd." msgstr "Pogon {0} nije montiran ili ne sadrži audio cd." #: src/Gui/MainWindow.cs:406 msgid "Confirmation" msgstr "Potvrda" #: src/Gui/MainWindow.cs:407 msgid "Are you sure you really want to remove the selected volume?" msgstr "Jeste li sigurni da želite zapravo izbrisati odabranu zapremninu?" #: src/Gui/MainWindow.cs:712 #, csharp-format msgid "Please insert volume '{0}'." msgstr "" #: src/Gui/MainWindow.cs:714 msgid "Waiting for volume" msgstr "" #: src/Gui/MainWindow.cs:966 msgid "Add Volume" msgstr "" #: src/Gui/MainWindow.cs:970 msgid "Search" msgstr "" #: src/Gui/MainWindow.cs:973 msgid "App Menu" msgstr "" #: src/Gui/MainWindow.cs:979 msgid "_New Database" msgstr "_Nova baza podataka" #: src/Gui/MainWindow.cs:982 msgid "_Open Database" msgstr "_Otvoriti bazu podataka" #: src/Gui/MainWindow.cs:985 msgid "Open Default Database" msgstr "_Otvori zadanu bazu podataka" #: src/Gui/MainWindow.cs:991 msgid "Recent Databases" msgstr "Nedavne baze podataka" #: src/Gui/MainWindow.cs:998 msgid "_Import" msgstr "_Uvozi" #: src/Gui/MainWindow.cs:1001 msgid "_Preferences" msgstr "_Osobitosti" #: src/Gui/MainWindow.cs:1004 msgid "_Database Properties" msgstr "_Svojstva baze podataka" #: src/Gui/MainWindow.cs:1007 msgid "Info" msgstr "" #: src/Gui/MainWindow.cs:1010 msgid "_Quit" msgstr "_Izlaz" #: src/Gui/MainWindow.cs:1016 msgid "_Edit Volume" msgstr "_Uredi pogon" #: src/Gui/MainWindow.cs:1019 msgid "_Remove Volume" msgstr "_Izbriši pogon" #: src/Gui/MainWindow.cs:1022 msgid "Rescan Volume" msgstr "" #: src/Gui/MainWindow.cs:1034 msgid "Sort by" msgstr "Razvrstaj po" #: src/Gui/MainWindow.cs:1037 msgid "Descending" msgstr "Silazno" #: src/Gui/MainWindow.cs:1043 msgid "Date added" msgstr "Datum dodavanja" #: src/Gui/MainWindow.cs:1044 msgid "Title" msgstr "Naslov" #: src/Gui/MainWindow.cs:1045 msgid "Drivetype" msgstr "Vrsta pogona" #: src/Gui/MainWindow.cs:1142 msgid "Filter volumes" msgstr "Filtriranje pogona" #: src/Gui/Import.cs:29 msgid "Import" msgstr "Uvezi" #: src/Gui/Import.cs:30 msgid "Abort" msgstr "Prekid" #: src/Gui/Import.cs:31 msgid "Please select a database." msgstr "" #: src/Gui/Import.cs:72 #, csharp-format msgid "{0:0}% completed." msgstr "{0:0}% Završreno" #: src/Gui/Import.cs:82 msgid "Import failed" msgstr "Uvoz nije uspio" #: src/Gui/Import.cs:85 msgid "Import failed!" msgstr "Uvoz neuspješan" #: src/Gui/Import.cs:87 msgid "Import aborted." msgstr "Uvoz obstavljen." #: src/Gui/Import.cs:89 msgid "Import completed successfully." msgstr "Uvoz završen uspješno." #: src/Gui/Import.cs:121 msgid "Import in progress" msgstr "Uvoz u tijeku" #: src/Gui/Import.cs:122 msgid "You must stop the import before closing this window." msgstr "Morate zaustaviti uvoz prije zatvaranja prozora." #: src/Gui/Import.cs:148 msgid "Unknown format." msgstr "" #: src/Gui/Import.cs:175 msgid "Import Database" msgstr "Uvezi bazu podataka" #: src/Gui/Import.cs:186 msgid "Please select a database to import" msgstr "Odaberite bazu podataka za uvoz" #: src/Gui/Import.cs:194 msgid "All supported formats" msgstr "" #: src/Gui/Import.cs:198 #, csharp-format msgid ".{0} files" msgstr "" #: src/Gui/Import.cs:209 msgid "Database:" msgstr "Baza podataka:" #: src/Gui/Import.cs:210 msgid "Format:" msgstr "Oblik:" #: src/Gui/ItemProperties.cs:29 msgid "Item Properties" msgstr "Svojstva stavke" #: src/Gui/VolumeScanner.cs:116 msgid "Scanning started." msgstr "Skeniranje je počelo." #: src/Gui/VolumeScanner.cs:118 #, csharp-format msgid "Scanning of drive '{0}' started." msgstr "Počelo je skeniranje pogona '{0}'." #: src/Gui/VolumeScanner.cs:124 #, csharp-format msgid "" "Options: generate thumbs: {0}, extract metadata: {1}, discard symlinks: {2}, " "hashing: {3}." msgstr "" "Opcije: generirati sličice: {0} , izvaditi metapodatke: {1}, odbaciti " "simboličke veze: {2}, hashing: {3}." #: src/Gui/VolumeScanner.cs:131 #, csharp-format msgid "Options: MusicBrainz enabled: {0}" msgstr "Opcije: MusicBrainz omogućena: {0}" #: src/Gui/VolumeScanner.cs:157 msgid "Time" msgstr "Vrijeme" #: src/Gui/VolumeScanner.cs:161 msgid "Message" msgstr "Poruka" #: src/Gui/VolumeScanner.cs:258 msgid "Stopping Scanner and performing rollback..." msgstr "Zaustavljam skener i storniram." #: src/Gui/VolumeScanner.cs:268 msgid "yes" msgstr "da" #: src/Gui/VolumeScanner.cs:268 msgid "no" msgstr "ne" #: src/Gui/VolumeScanner.cs:291 msgid "Scan in progress" msgstr "Skeniranje u tijeku" #: src/Gui/VolumeScanner.cs:291 msgid "You must stop scanning before closing this window." msgstr "Morate zaustaviti skeniranje prije zatvaranja prozora." #: src/Gui/VolumeScanner.cs:346 #, csharp-format msgid "An unhandled exception occured ({0})." msgstr "Dogodila se neobradiva iznimka ({0})." #: src/Gui/VolumeScanner.cs:347 msgid "All database changes have been rolled back." msgstr "Promjene u bazi podataka su stornirane." #: src/Gui/VolumeScanner.cs:354 #, csharp-format msgid "Scanning failed. Reason: an unhandled exception occured ({0})." msgstr "" "Skeniranje nije uspjelo. Razlog: dogodila se neobradiva iznimka ({0})." #: src/Gui/VolumeScanner.cs:356 msgid "Scanning aborted." msgstr "Skeniranje prekinuto." #: src/Gui/VolumeScanner.cs:358 msgid "Scanning completed successfully." msgstr "Skeniranje uspješno završeno." #: src/Gui/VolumeScanner.cs:488 msgid "VolumeScanner" msgstr "SkenerPogona" #: src/Gui/VolumeScanner.cs:500 msgid "Volume Information:" msgstr "Informacije o pogonu:" #: src/Gui/VolumeScanner.cs:510 msgid "Scanner Log:" msgstr "Dnevnik skenera:" #: src/Gui/VolumeScanner.cs:527 msgid "Database access" msgstr "Pristup bazi podataka" #: src/Gui/Preferences.cs:119 msgid "None" msgstr "Ništa" #: src/Gui/Preferences.cs:228 msgid "Unsupported theme" msgstr "Nrpodržana tema" #: src/Gui/Preferences.cs:229 msgid "The selected icon theme is currently not supported on your system." msgstr "Odabrana tema ikona trenutno nije podržana na vašem sistemu." #: src/Gui/Preferences.cs:267 msgid "Restart required" msgstr "Potrebno ponovno pokretanje" #: src/Gui/Preferences.cs:268 #, csharp-format msgid "You must restart {0} for icontheme changes to take effect." msgstr "Izmjene teme ikona bit će vidljive nakon ponovnog pokretanja {0}" #: src/Gui/Preferences.cs:298 msgid "Preferences" msgstr "Osobitosti" #: src/Gui/Preferences.cs:322 msgid "_Load Defaults" msgstr "_Učitaj uobičajene vrijednosti" #: src/Gui/Preferences.cs:349 msgid "Icon theme:" msgstr "Tema ikona:" #: src/Gui/Preferences.cs:355 msgid "Reopen most recent database on startup" msgstr "Otvori prijašnju bazu podataka na pokretanju." #: src/Gui/Preferences.cs:359 msgid "Show iteminfo panel" msgstr "Prikaži panel za info. o stavkama." #: src/Gui/Preferences.cs:363 msgid "Show hidden files" msgstr "Prikaži skrivene datoteke" #: src/Gui/Preferences.cs:367 msgid "Show thumbnails in the filebrowser" msgstr "Prikaži sličice u pregledniku datoteka" #: src/Gui/Preferences.cs:370 msgid "General" msgstr "Općenito" #: src/Gui/Preferences.cs:378 msgid "Don't prompt, always scan:" msgstr "Ne pitaj, uvijek skeniraj:" #: src/Gui/Preferences.cs:397 msgid "Generate Thumbnails" msgstr "Generiti ikone" #: src/Gui/Preferences.cs:401 msgid "Extract metadata" msgstr "Izvadi meta podatke" #: src/Gui/Preferences.cs:405 msgid "Discard symbolic links" msgstr "Odbaci dimboličke veze" #: src/Gui/Preferences.cs:409 msgid "Compute hashcodes for files (slow!)" msgstr "Izračunaj hash vrijednosti za datoteke (sporo!)" #: src/Gui/Preferences.cs:413 msgid "Fetch audio cd metadata from MusicBrainz.org" msgstr "Dobavi meta podatke za audio cd s MusicBrainz.org" #: src/Gui/Preferences.cs:416 msgid "Scanner" msgstr "Skener" Basenji/po/ru.po0000664000175000017500000006035212067326706013732 0ustar patrickpatrick# Russian translation for basenji # Copyright (c) 2009 Rosetta Contributors and Canonical Ltd 2009 # This file is distributed under the same license as the basenji package. # FIRST AUTHOR , 2009. # msgid "" msgstr "" "Project-Id-Version: basenji\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2012-07-15 15:49+0200\n" "PO-Revision-Date: 2012-02-19 12:50+0000\n" "Last-Translator: Sergey Shlyapugin \n" "Language-Team: Russian \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2012-11-18 12:32+0000\n" "X-Generator: Launchpad (build 16278)\n" #: src/Util.cs:30 #, csharp-format msgid "{0} Bytes" msgstr "{0} Байт" #: src/Util.cs:32 msgid "Bytes" msgstr "Байт" #: src/Util.cs:32 msgid "KB" msgstr "КБ" #: src/Util.cs:32 msgid "MB" msgstr "МБ" #: src/Util.cs:32 msgid "GB" msgstr "ГБ" #: src/Util.cs:32 msgid "TB" msgstr "ТБ" #: src/Options.cs:477 msgid "OptionName" msgstr "Название Опции" #: src/FileDialog.cs:51 msgid "VolumeDatabase files" msgstr "Файлы томов базы данных" #: src/FileDialog.cs:56 msgid "All files" msgstr "Все файлы" #: src/Main.cs:142 src/Gui/MainWindow.cs:76 src/Gui/MainWindow.cs:92 #: src/Gui/MainWindow.cs:334 src/Gui/MainWindow.cs:355 #: src/Gui/MainWindow.cs:377 src/Gui/MainWindow.cs:386 #: src/Gui/MainWindow.cs:635 msgid "Error" msgstr "Ошибка" #: src/Main.cs:142 #, csharp-format msgid "{0} is already running." msgstr "{0} уже выполняется." #: src/Gui/Widgets/VolumeView.cs:42 src/Gui/Widgets/SearchResultView.cs:30 msgid "Unnamed" msgstr "Без имени" #: src/Gui/Widgets/VolumeView.cs:43 #: src/Gui/Widgets/Editors/VolumeEditor.cs:259 msgid "Category:" msgstr "Категория:" #: src/Gui/Widgets/VolumeView.cs:44 msgid "files" msgstr "файлов" #: src/Gui/Widgets/VolumeView.cs:45 msgid "tracks" msgstr "дорожек" #: src/Gui/Widgets/ItemView.cs:29 msgid "Loading..." msgstr "Загрузка..." #: src/Gui/Widgets/ItemView.cs:30 msgid "(empty)" msgstr "(пусто)" #: src/Gui/Widgets/ItemView.cs:99 src/Gui/DriveSelection.cs:80 msgid "Unknown" msgstr "Неизвестный" #: src/Gui/Widgets/ItemView.cs:170 src/Gui/Widgets/Editors/ItemEditor.cs:96 msgid "Name" msgstr "Имя" #: src/Gui/Widgets/ItemView.cs:176 msgid "Artist" msgstr "Исполнитель" #: src/Gui/Widgets/ItemView.cs:181 #: src/Gui/Widgets/Editors/AudioTrackItemEditor.cs:53 #: src/Gui/Widgets/ItemInfo.cs:225 src/Gui/Widgets/ItemInfo.cs:288 msgid "Duration" msgstr "Длительность" #: src/Gui/Widgets/Editors/FileSystemVolumeEditor.cs:34 #: src/Gui/DriveSelection.cs:168 msgid "Filesystem" msgstr "Файловая система" #: src/Gui/Widgets/Editors/FileSystemVolumeEditor.cs:65 msgid "Files:" msgstr "Файлы:" #: src/Gui/Widgets/Editors/FileSystemVolumeEditor.cs:66 msgid "Directories:" msgstr "Каталоги:" #: src/Gui/Widgets/Editors/FileSystemVolumeEditor.cs:67 msgid "Total size:" msgstr "Общий размер:" #: src/Gui/Widgets/Editors/ItemEditor.cs:95 msgid "Item type" msgstr "Тип объекта" #: src/Gui/Widgets/Editors/ItemEditor.cs:111 src/Gui/Widgets/ItemInfo.cs:371 msgid "Note" msgstr "Примечание" #: src/Gui/Widgets/Editors/ItemEditor.cs:112 src/Gui/Widgets/ItemInfo.cs:374 msgid "Keywords" msgstr "Ключевые слова" #: src/Gui/Widgets/Editors/AudioTrackItemEditor.cs:31 #: src/Gui/Widgets/SearchResultView.cs:34 msgid "Audio CD track" msgstr "Дорожка аудио CD" #: src/Gui/Widgets/Editors/AudioTrackItemEditor.cs:54 #: src/Gui/Widgets/ItemInfo.cs:230 msgid "Type" msgstr "Тип" #: src/Gui/Widgets/Editors/DirectoryItemEditor.cs:28 msgid "Directory" msgstr "Каталог" #: src/Gui/Widgets/Editors/FileSystemItemEditor.cs:59 #: src/Gui/Widgets/SearchResultView.cs:31 src/Gui/Widgets/ItemInfo.cs:183 msgid "Location" msgstr "Размещение" #: src/Gui/Widgets/Editors/FileSystemItemEditor.cs:60 #: src/Gui/Widgets/ItemInfo.cs:185 msgid "Last write time" msgstr "Время последней записи" #: src/Gui/Widgets/Editors/FileSystemItemEditor.cs:61 #: src/Gui/Widgets/ItemInfo.cs:210 msgid "Filetype" msgstr "Тип файла" #: src/Gui/Widgets/Editors/FileItemEditor.cs:31 msgid "File" msgstr "Файл" #: src/Gui/Widgets/Editors/FileItemEditor.cs:52 #: src/Gui/Widgets/ItemInfo.cs:204 src/Gui/Widgets/ItemInfo.cs:226 #: src/Gui/DriveSelection.cs:148 msgid "Size" msgstr "Размер" #: src/Gui/Widgets/Editors/FileItemEditor.cs:53 #: src/Gui/Widgets/ItemInfo.cs:206 msgid "Hash" msgstr "Хэш" #: src/Gui/Widgets/Editors/AudioCdVolumeEditor.cs:33 msgid "Audio CD" msgstr "Audio CD" #: src/Gui/Widgets/Editors/AudioCdVolumeEditor.cs:63 msgid "Tracks:" msgstr "Дорожки:" #: src/Gui/Widgets/Editors/AudioCdVolumeEditor.cs:64 msgid "Duration:" msgstr "Длительность:" #: src/Gui/Widgets/Editors/VolumeEditor.cs:45 msgid "Backup" msgstr "Резервная копия" #: src/Gui/Widgets/Editors/VolumeEditor.cs:46 #: src/Gui/Widgets/CategoryView.cs:60 msgid "Documents" msgstr "Документы" #: src/Gui/Widgets/Editors/VolumeEditor.cs:47 #: src/Gui/Widgets/CategoryView.cs:61 msgid "Music" msgstr "Музыка" #: src/Gui/Widgets/Editors/VolumeEditor.cs:48 msgid "Audiobooks" msgstr "Аудиокниги" #: src/Gui/Widgets/Editors/VolumeEditor.cs:49 #: src/Gui/Widgets/CategoryView.cs:62 msgid "Movies" msgstr "Фильмы" #: src/Gui/Widgets/Editors/VolumeEditor.cs:50 msgid "Videos" msgstr "Видео" #: src/Gui/Widgets/Editors/VolumeEditor.cs:51 msgid "Pictures" msgstr "Изображения" #: src/Gui/Widgets/Editors/VolumeEditor.cs:52 msgid "Games" msgstr "Игры" #: src/Gui/Widgets/Editors/VolumeEditor.cs:53 src/Gui/Widgets/ItemInfo.cs:319 msgid "Software" msgstr "Программа" #: src/Gui/Widgets/Editors/VolumeEditor.cs:54 msgid "Misc" msgstr "Разное" #: src/Gui/Widgets/Editors/VolumeEditor.cs:55 msgid "Other" msgstr "Прочее" #: src/Gui/Widgets/Editors/VolumeEditor.cs:225 msgid "Yes" msgstr "Да" #: src/Gui/Widgets/Editors/VolumeEditor.cs:225 msgid "No" msgstr "Нет" #: src/Gui/Widgets/Editors/VolumeEditor.cs:235 msgid "Volume type:" msgstr "Тип тома:" #: src/Gui/Widgets/Editors/VolumeEditor.cs:236 msgid "Hashed:" msgstr "Хэширование:" #: src/Gui/Widgets/Editors/VolumeEditor.cs:237 msgid "Added:" msgstr "Добавлено:" #: src/Gui/Widgets/Editors/VolumeEditor.cs:258 msgid "Archive No.:" msgstr "Номер архива:" #: src/Gui/Widgets/Editors/VolumeEditor.cs:260 msgid "Title:" msgstr "Название:" #: src/Gui/Widgets/Editors/VolumeEditor.cs:261 src/Gui/DBProperties.cs:98 msgid "Description:" msgstr "Описание:" #: src/Gui/Widgets/Editors/VolumeEditor.cs:262 msgid "Keywords:" msgstr "Ключевые слова:" #: src/Gui/Widgets/Editors/VolumeEditor.cs:263 msgid "Loaned to:" msgstr "Займ:" #: src/Gui/Widgets/Editors/VolumeEditor.cs:264 msgid "Loaned date:" msgstr "Датай займа:" #: src/Gui/Widgets/Editors/VolumeEditor.cs:265 msgid "Return date:" msgstr "Дата возврата:" #: src/Gui/Widgets/CategoryView.cs:58 msgid "Directories" msgstr "Каталоги" #: src/Gui/Widgets/CategoryView.cs:59 msgid "Text" msgstr "Текст" #: src/Gui/Widgets/CategoryView.cs:63 msgid "Images" msgstr "Изображения" #: src/Gui/Widgets/CategoryView.cs:64 msgid "Applications" msgstr "Приложения" #: src/Gui/Widgets/CategoryView.cs:65 msgid "Archives" msgstr "Архивы" #: src/Gui/Widgets/CategoryView.cs:66 msgid "Development" msgstr "Разработка" #: src/Gui/Widgets/CategoryView.cs:96 src/Gui/MainWindow.cs:1046 msgid "Category" msgstr "Категория" #: src/Gui/Widgets/CategoryView.cs:128 msgid "All items" msgstr "Все элементы" #: src/Gui/Widgets/SearchResultView.cs:32 msgid "Volume" msgstr "Том" #: src/Gui/Widgets/SearchResultView.cs:33 src/Gui/MainWindow.cs:1040 msgid "Archive No." msgstr "Номер архива:" #: src/Gui/Widgets/ItemInfo.cs:40 msgid "by" msgstr "от" #: src/Gui/Widgets/ItemInfo.cs:41 msgid "from" msgstr "от" #: src/Gui/Widgets/ItemInfo.cs:196 msgid "Symlink target" msgstr "Объект символической ссылки" #: src/Gui/Widgets/ItemInfo.cs:227 msgid "Track No." msgstr "Номер дорожки:" #: src/Gui/Widgets/ItemInfo.cs:258 msgid "Genre" msgstr "Жанр" #: src/Gui/Widgets/ItemInfo.cs:278 msgid "Year" msgstr "Год" #: src/Gui/Widgets/ItemInfo.cs:283 msgid "Description" msgstr "Описание" #: src/Gui/Widgets/ItemInfo.cs:294 msgid "Dimensions" msgstr "Размеры" #: src/Gui/Widgets/ItemInfo.cs:299 msgid "Format" msgstr "Формат" #: src/Gui/Widgets/ItemInfo.cs:303 msgid "Author" msgstr "Автор" #: src/Gui/Widgets/ItemInfo.cs:307 msgid "Copyright" msgstr "Авторские права" #: src/Gui/Widgets/ItemInfo.cs:311 msgid "Producer" msgstr "Продюсер" #: src/Gui/Widgets/ItemInfo.cs:315 msgid "Creator" msgstr "Автор" #: src/Gui/Widgets/ItemInfo.cs:323 msgid "Language" msgstr "Язык" #: src/Gui/Widgets/ItemInfo.cs:327 msgid "Page count" msgstr "Количество страниц" #: src/Gui/Widgets/ItemInfo.cs:346 msgid "File count" msgstr "Количество файлов" #: src/Gui/Widgets/PageNavigation.cs:27 msgid "No items." msgstr "Нет объектов." #: src/Gui/Widgets/PageNavigation.cs:145 #, csharp-format msgid "Page {0}/{1} ({2} - {3} of {4} items)" msgstr "Страница {0}/{1} ({2} - {3} из {4} объектов)" #: src/Gui/ObjectProperties.cs:54 src/Gui/VolumeScanner.cs:248 msgid "Invalid data" msgstr "Неверные данные" #: src/Gui/ObjectProperties.cs:54 src/Gui/VolumeScanner.cs:249 #, csharp-format msgid "" "\"{0}\" is {1}.\n" "\n" "Expected format: {2}\n" "Please correct or remove the data you entered." msgstr "" "\"{0}\" - {1}.\n" "\n" "Ожидаемый формат: {2}\n" "Пожалуйста, исправьте или удалите введённые данные." #: src/Gui/DBProperties.cs:85 msgid "Database Properties" msgstr "Свойства базы данных" #: src/Gui/DBProperties.cs:97 msgid "Name:" msgstr "Название:" #: src/Gui/DBProperties.cs:99 msgid "Created:" msgstr "Создано:" #: src/Gui/VolumeProperties.cs:29 msgid "Volume Properties" msgstr "Свойства тома" #: src/Gui/DriveSelection.cs:60 msgid "Waiting for drives..." msgstr "Ожидание устройств..." #: src/Gui/DriveSelection.cs:133 msgid "Drive" msgstr "Носитель информации" #: src/Gui/DriveSelection.cs:139 msgid "Label" msgstr "Метка" #: src/Gui/DriveSelection.cs:241 msgid "Please select a drive to scan" msgstr "Пожалуйста, выберите диск для сканирования" #: src/Gui/About.cs:28 msgid "A cross-platform media indexing/search tool." msgstr "Кроссплатформенный инструмент индексирования/поиска медиафайлов." #: src/Gui/About.cs:29 #, csharp-format msgid "Using VolumeDB v{0}." msgstr "Используется VolumeDB v{0}." #: src/Gui/About.cs:31 msgid "Copyright (c) " msgstr "Copyright (c) " #: src/Gui/ItemSearch.cs:81 #, csharp-format msgid "Found {0} items in {1:F3} seconds." msgstr "Найдено {0} объектов за {1:F3} секунд." #: src/Gui/ItemSearch.cs:92 src/Gui/MainWindow.cs:519 msgid "Timeout: another search is probably still in progress." msgstr "" "Превышение лимита времени: еще один поиск, возможно, все еще продолжается." #: src/Gui/ItemSearch.cs:94 msgid "Too many search results. Please refine your search criteria." msgstr "" "Слишком большое количество результатов поиска. Пожалуйста, уточните критерии " "поиска." #: src/Gui/ItemSearch.cs:112 src/Gui/MainWindow.cs:535 msgid "Searching..." msgstr "Идёт поиск..." #: src/Gui/ItemSearch.cs:267 msgid "Search Items" msgstr "Поиск объектов" #: src/Gui/ItemSearch.cs:279 src/Gui/MainWindow.cs:1145 msgid "default" msgstr "по умолчанию" #: src/Gui/ItemSearch.cs:283 msgid "Search items" msgstr "Поиск записей" #: src/Gui/ItemSearch.cs:318 msgid "Quick tip:" msgstr "" #: src/Gui/ItemSearch.cs:319 #, csharp-format msgid "" "Click on the icon to the left of the search field to build advanced search " "queries.\n" "Example: {0}" msgstr "" #: src/Gui/ItemSearch.cs:326 msgid "No search results." msgstr "Поиск ничего не дал." #: src/Gui/ItemSearch.cs:375 src/Gui/MainWindow.cs:1028 msgid "Edit Item" msgstr "Редактировать объект" #: src/Gui/ItemSearch.cs:382 msgid "Show in Main Window" msgstr "" #: src/Gui/MainWindow.cs:77 src/Gui/MainWindow.cs:93 src/Gui/MainWindow.cs:635 #, csharp-format msgid "Database '{0}' not found." msgstr "База данных '{0}'не найдена" #: src/Gui/MainWindow.cs:185 msgid "Database not found" msgstr "База данных не найдена" #: src/Gui/MainWindow.cs:186 msgid "Default database not found. Create?" msgstr "Основная база данных не найдена. Создать?" #: src/Gui/MainWindow.cs:215 msgid "Unsupported database version" msgstr "Неподдерживаемая версия базы данных" #: src/Gui/MainWindow.cs:216 msgid "This database version is not supported." msgstr "Эта версия базы данных не поддерживается." #: src/Gui/MainWindow.cs:235 #, csharp-format msgid "{0} volumes loaded." msgstr "{0} томов загружено." #: src/Gui/MainWindow.cs:256 #, csharp-format msgid "An error occured while loading the volume list: {0}" msgstr "Обнаружена ошибка при загрузке списка томов: {0}" #: src/Gui/MainWindow.cs:300 msgid "Please enter the name for the new database" msgstr "Пожалуйста, введите название для новой базы данных" #: src/Gui/MainWindow.cs:312 msgid "Database exists" msgstr "База данных уже существует" #: src/Gui/MainWindow.cs:313 msgid "Database already exists. Overwrite?" msgstr "Такая база данных уже существует. Перезаписать?" #: src/Gui/MainWindow.cs:326 msgid "Please select a database" msgstr "Пожалуйста, выберите базу данных" #: src/Gui/MainWindow.cs:335 src/Gui/Import.cs:83 msgid "Database not found." msgstr "База данных не найдена." #: src/Gui/MainWindow.cs:356 #, csharp-format msgid "" "An error occured while accessing drive {0}:\n" "{1}" msgstr "" "Ошибка при доступе к диску {0}:\n" "{1}" #: src/Gui/MainWindow.cs:378 #, csharp-format msgid "Drive {0} is not ready." msgstr "Диск {0} не готов." #: src/Gui/MainWindow.cs:387 #, csharp-format msgid "Drive {0} is neither mounted nor does it contain an audio cd." msgstr "Диск {0} не подключен и не содержит звуковых данных." #: src/Gui/MainWindow.cs:406 msgid "Confirmation" msgstr "Подтверждение" #: src/Gui/MainWindow.cs:407 msgid "Are you sure you really want to remove the selected volume?" msgstr "Вы действительно хотите удалить выбранный том?" #: src/Gui/MainWindow.cs:712 #, csharp-format msgid "Please insert volume '{0}'." msgstr "" #: src/Gui/MainWindow.cs:714 msgid "Waiting for volume" msgstr "" #: src/Gui/MainWindow.cs:966 msgid "Add Volume" msgstr "" #: src/Gui/MainWindow.cs:970 msgid "Search" msgstr "" #: src/Gui/MainWindow.cs:973 msgid "App Menu" msgstr "" #: src/Gui/MainWindow.cs:979 msgid "_New Database" msgstr "_Новая база данных" #: src/Gui/MainWindow.cs:982 msgid "_Open Database" msgstr "_Открыть базу данных" #: src/Gui/MainWindow.cs:985 msgid "Open Default Database" msgstr "Открыть основную базу данных" #: src/Gui/MainWindow.cs:991 msgid "Recent Databases" msgstr "Недавние базы данных" #: src/Gui/MainWindow.cs:998 msgid "_Import" msgstr "_Импортировать" #: src/Gui/MainWindow.cs:1001 msgid "_Preferences" msgstr "_Настройки" #: src/Gui/MainWindow.cs:1004 msgid "_Database Properties" msgstr "_Свойства базы данных" #: src/Gui/MainWindow.cs:1007 msgid "Info" msgstr "" #: src/Gui/MainWindow.cs:1010 msgid "_Quit" msgstr "_Выход" #: src/Gui/MainWindow.cs:1016 msgid "_Edit Volume" msgstr "_Редактировать том" #: src/Gui/MainWindow.cs:1019 msgid "_Remove Volume" msgstr "_Удалить том" #: src/Gui/MainWindow.cs:1022 msgid "Rescan Volume" msgstr "" #: src/Gui/MainWindow.cs:1034 msgid "Sort by" msgstr "Сортировать по" #: src/Gui/MainWindow.cs:1037 msgid "Descending" msgstr "Убыванию" #: src/Gui/MainWindow.cs:1043 msgid "Date added" msgstr "Дата добавления" #: src/Gui/MainWindow.cs:1044 msgid "Title" msgstr "Заголовок" #: src/Gui/MainWindow.cs:1045 msgid "Drivetype" msgstr "Тип накопителя" #: src/Gui/MainWindow.cs:1142 msgid "Filter volumes" msgstr "Фильтр томов" #: src/Gui/Import.cs:29 msgid "Import" msgstr "Импортировать" #: src/Gui/Import.cs:30 msgid "Abort" msgstr "Прервать" #: src/Gui/Import.cs:31 msgid "Please select a database." msgstr "" #: src/Gui/Import.cs:72 #, csharp-format msgid "{0:0}% completed." msgstr "{0:0}% завершено." #: src/Gui/Import.cs:82 msgid "Import failed" msgstr "Импортирование не удалось" #: src/Gui/Import.cs:85 msgid "Import failed!" msgstr "Импортирование не удалось!" #: src/Gui/Import.cs:87 msgid "Import aborted." msgstr "Импортирование отменено" #: src/Gui/Import.cs:89 msgid "Import completed successfully." msgstr "Импортирование успешно завершено" #: src/Gui/Import.cs:121 msgid "Import in progress" msgstr "Идёт импортирование" #: src/Gui/Import.cs:122 msgid "You must stop the import before closing this window." msgstr "Вы должны остановить импортирование перед тем, как закрыть окно." #: src/Gui/Import.cs:148 msgid "Unknown format." msgstr "" #: src/Gui/Import.cs:175 msgid "Import Database" msgstr "Импортировать базу данных" #: src/Gui/Import.cs:186 msgid "Please select a database to import" msgstr "Выберите базу данных для импорта" #: src/Gui/Import.cs:194 msgid "All supported formats" msgstr "" #: src/Gui/Import.cs:198 #, csharp-format msgid ".{0} files" msgstr "" #: src/Gui/Import.cs:209 msgid "Database:" msgstr "База данных:" #: src/Gui/Import.cs:210 msgid "Format:" msgstr "Формат:" #: src/Gui/ItemProperties.cs:29 msgid "Item Properties" msgstr "Свойства объекта" #: src/Gui/VolumeScanner.cs:116 msgid "Scanning started." msgstr "Выполняется сканирование." #: src/Gui/VolumeScanner.cs:118 #, csharp-format msgid "Scanning of drive '{0}' started." msgstr "Выполняется сканирование диска '{0}'." #: src/Gui/VolumeScanner.cs:124 #, csharp-format msgid "" "Options: generate thumbs: {0}, extract metadata: {1}, discard symlinks: {2}, " "hashing: {3}." msgstr "" "Параметры: Предварительный просмотр: {0}, Извлечение мета-данных: {1}, Не " "ссылаться на символы: {2}, Хэшировать: {3}." #: src/Gui/VolumeScanner.cs:131 #, csharp-format msgid "Options: MusicBrainz enabled: {0}" msgstr "Функции: MusicBrainz включено: {0}" #: src/Gui/VolumeScanner.cs:157 msgid "Time" msgstr "Время" #: src/Gui/VolumeScanner.cs:161 msgid "Message" msgstr "Сообщение" #: src/Gui/VolumeScanner.cs:258 msgid "Stopping Scanner and performing rollback..." msgstr "Остановка сканера, возврат на исходную позицию..." #: src/Gui/VolumeScanner.cs:268 msgid "yes" msgstr "да" #: src/Gui/VolumeScanner.cs:268 msgid "no" msgstr "нет" #: src/Gui/VolumeScanner.cs:291 msgid "Scan in progress" msgstr "Идёт сканирование" #: src/Gui/VolumeScanner.cs:291 msgid "You must stop scanning before closing this window." msgstr "Вы должны остановить сканирование перед закрытием этого окна." #: src/Gui/VolumeScanner.cs:346 #, csharp-format msgid "An unhandled exception occured ({0})." msgstr "Возникло необрабатываемое исключение ({0})." #: src/Gui/VolumeScanner.cs:347 msgid "All database changes have been rolled back." msgstr "Все изменения в базе данных отменены." #: src/Gui/VolumeScanner.cs:354 #, csharp-format msgid "Scanning failed. Reason: an unhandled exception occured ({0})." msgstr "" "Не удалось произвести сканирование. Причина: необработанное исключение ({0})." #: src/Gui/VolumeScanner.cs:356 msgid "Scanning aborted." msgstr "Сканирование прервано." #: src/Gui/VolumeScanner.cs:358 msgid "Scanning completed successfully." msgstr "Сканирование успешно завершено." #: src/Gui/VolumeScanner.cs:488 msgid "VolumeScanner" msgstr "Глубина сканирования" #: src/Gui/VolumeScanner.cs:500 msgid "Volume Information:" msgstr " Информаия о звуке: " #: src/Gui/VolumeScanner.cs:510 msgid "Scanner Log:" msgstr "Пошаговая запись действий сканера:" #: src/Gui/VolumeScanner.cs:527 msgid "Database access" msgstr "Доступ к базе данных" #: src/Gui/Preferences.cs:119 msgid "None" msgstr "Отсутствует" #: src/Gui/Preferences.cs:228 msgid "Unsupported theme" msgstr "Непригодный материал" #: src/Gui/Preferences.cs:229 msgid "The selected icon theme is currently not supported on your system." msgstr "" "Выбранные темы значков в настоящее время не поддерживается на вашей системе." #: src/Gui/Preferences.cs:267 msgid "Restart required" msgstr "Требуется перезапуск" #: src/Gui/Preferences.cs:268 #, csharp-format msgid "You must restart {0} for icontheme changes to take effect." msgstr "Вы должны перезапустить {0} для применения изменений в теме иконок" #: src/Gui/Preferences.cs:298 msgid "Preferences" msgstr "Настройки" #: src/Gui/Preferences.cs:322 msgid "_Load Defaults" msgstr "З_агрузить параметры по умолчанию" #: src/Gui/Preferences.cs:349 msgid "Icon theme:" msgstr "Тема иконок" #: src/Gui/Preferences.cs:355 msgid "Reopen most recent database on startup" msgstr "Повторное открытие последней базы данных при запуске" #: src/Gui/Preferences.cs:359 msgid "Show iteminfo panel" msgstr "Показать панель \"iteminfo\"" #: src/Gui/Preferences.cs:363 msgid "Show hidden files" msgstr "Показывать скрытые файлы" #: src/Gui/Preferences.cs:367 msgid "Show thumbnails in the filebrowser" msgstr "Показывать эскизы изображений в окне просмотра файлов" #: src/Gui/Preferences.cs:370 msgid "General" msgstr "Общее" #: src/Gui/Preferences.cs:378 msgid "Don't prompt, always scan:" msgstr "Не запрашивать, всегда сканировать:" #: src/Gui/Preferences.cs:397 msgid "Generate Thumbnails" msgstr "Создавать эскизы" #: src/Gui/Preferences.cs:401 msgid "Extract metadata" msgstr "Извлечения метаданных" #: src/Gui/Preferences.cs:405 msgid "Discard symbolic links" msgstr "Отклонить символические ссылки." #: src/Gui/Preferences.cs:409 msgid "Compute hashcodes for files (slow!)" msgstr "Посчитать хеш-коды для файлов (Долго!)" #: src/Gui/Preferences.cs:413 msgid "Fetch audio cd metadata from MusicBrainz.org" msgstr "Взять метаданные для аудио дисков с сайта MusicBrainz.org" #: src/Gui/Preferences.cs:416 msgid "Scanner" msgstr "Сканер" Basenji/po/tr.po0000664000175000017500000004602012067326706013725 0ustar patrickpatrick# Turkish translation for basenji # Copyright (c) 2010 Rosetta Contributors and Canonical Ltd 2010 # This file is distributed under the same license as the basenji package. # FIRST AUTHOR , 2010. # msgid "" msgstr "" "Project-Id-Version: basenji\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2012-07-15 15:49+0200\n" "PO-Revision-Date: 2010-07-10 13:47+0000\n" "Last-Translator: Cihan Ersoy \n" "Language-Team: Turkish \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2012-10-27 11:00+0000\n" "X-Generator: Launchpad (build 16194)\n" #: src/Util.cs:30 #, csharp-format msgid "{0} Bytes" msgstr "{0} Bayt" #: src/Util.cs:32 msgid "Bytes" msgstr "Bayt" #: src/Util.cs:32 msgid "KB" msgstr "KB" #: src/Util.cs:32 msgid "MB" msgstr "MB" #: src/Util.cs:32 msgid "GB" msgstr "GB" #: src/Util.cs:32 msgid "TB" msgstr "TB" #: src/Options.cs:477 msgid "OptionName" msgstr "" #: src/FileDialog.cs:51 msgid "VolumeDatabase files" msgstr "" #: src/FileDialog.cs:56 msgid "All files" msgstr "Tüm dosyalar" #: src/Main.cs:142 src/Gui/MainWindow.cs:76 src/Gui/MainWindow.cs:92 #: src/Gui/MainWindow.cs:334 src/Gui/MainWindow.cs:355 #: src/Gui/MainWindow.cs:377 src/Gui/MainWindow.cs:386 #: src/Gui/MainWindow.cs:635 msgid "Error" msgstr "Hata" #: src/Main.cs:142 #, csharp-format msgid "{0} is already running." msgstr "{0} zaten çalışıyor." #: src/Gui/Widgets/VolumeView.cs:42 src/Gui/Widgets/SearchResultView.cs:30 msgid "Unnamed" msgstr "Adlandırılmamış" #: src/Gui/Widgets/VolumeView.cs:43 #: src/Gui/Widgets/Editors/VolumeEditor.cs:259 msgid "Category:" msgstr "" #: src/Gui/Widgets/VolumeView.cs:44 msgid "files" msgstr "dosyalar" #: src/Gui/Widgets/VolumeView.cs:45 msgid "tracks" msgstr "parçalar" #: src/Gui/Widgets/ItemView.cs:29 msgid "Loading..." msgstr "Yükleniyor..." #: src/Gui/Widgets/ItemView.cs:30 msgid "(empty)" msgstr "(boş)" #: src/Gui/Widgets/ItemView.cs:99 src/Gui/DriveSelection.cs:80 msgid "Unknown" msgstr "Bilinmeyen" #: src/Gui/Widgets/ItemView.cs:170 src/Gui/Widgets/Editors/ItemEditor.cs:96 msgid "Name" msgstr "İsim" #: src/Gui/Widgets/ItemView.cs:176 msgid "Artist" msgstr "Sanatçı" #: src/Gui/Widgets/ItemView.cs:181 #: src/Gui/Widgets/Editors/AudioTrackItemEditor.cs:53 #: src/Gui/Widgets/ItemInfo.cs:225 src/Gui/Widgets/ItemInfo.cs:288 msgid "Duration" msgstr "Süre" #: src/Gui/Widgets/Editors/FileSystemVolumeEditor.cs:34 #: src/Gui/DriveSelection.cs:168 msgid "Filesystem" msgstr "Dosya Sistemi" #: src/Gui/Widgets/Editors/FileSystemVolumeEditor.cs:65 msgid "Files:" msgstr "Dosyalar:" #: src/Gui/Widgets/Editors/FileSystemVolumeEditor.cs:66 msgid "Directories:" msgstr "Dizinler:" #: src/Gui/Widgets/Editors/FileSystemVolumeEditor.cs:67 msgid "Total size:" msgstr "Toplam boyut:" #: src/Gui/Widgets/Editors/ItemEditor.cs:95 msgid "Item type" msgstr "Öge türü" #: src/Gui/Widgets/Editors/ItemEditor.cs:111 src/Gui/Widgets/ItemInfo.cs:371 msgid "Note" msgstr "Not" #: src/Gui/Widgets/Editors/ItemEditor.cs:112 src/Gui/Widgets/ItemInfo.cs:374 msgid "Keywords" msgstr "Anahtar kelimeler" #: src/Gui/Widgets/Editors/AudioTrackItemEditor.cs:31 #: src/Gui/Widgets/SearchResultView.cs:34 msgid "Audio CD track" msgstr "Ses CD parçası" #: src/Gui/Widgets/Editors/AudioTrackItemEditor.cs:54 #: src/Gui/Widgets/ItemInfo.cs:230 msgid "Type" msgstr "Tür" #: src/Gui/Widgets/Editors/DirectoryItemEditor.cs:28 msgid "Directory" msgstr "Dizin" #: src/Gui/Widgets/Editors/FileSystemItemEditor.cs:59 #: src/Gui/Widgets/SearchResultView.cs:31 src/Gui/Widgets/ItemInfo.cs:183 msgid "Location" msgstr "Konum" #: src/Gui/Widgets/Editors/FileSystemItemEditor.cs:60 #: src/Gui/Widgets/ItemInfo.cs:185 msgid "Last write time" msgstr "Son yazma zamanı" #: src/Gui/Widgets/Editors/FileSystemItemEditor.cs:61 #: src/Gui/Widgets/ItemInfo.cs:210 msgid "Filetype" msgstr "Dosya türü" #: src/Gui/Widgets/Editors/FileItemEditor.cs:31 msgid "File" msgstr "Dosya" #: src/Gui/Widgets/Editors/FileItemEditor.cs:52 #: src/Gui/Widgets/ItemInfo.cs:204 src/Gui/Widgets/ItemInfo.cs:226 #: src/Gui/DriveSelection.cs:148 msgid "Size" msgstr "Boyut" #: src/Gui/Widgets/Editors/FileItemEditor.cs:53 #: src/Gui/Widgets/ItemInfo.cs:206 msgid "Hash" msgstr "" #: src/Gui/Widgets/Editors/AudioCdVolumeEditor.cs:33 msgid "Audio CD" msgstr "Ses CD'si" #: src/Gui/Widgets/Editors/AudioCdVolumeEditor.cs:63 msgid "Tracks:" msgstr "Parçalar:" #: src/Gui/Widgets/Editors/AudioCdVolumeEditor.cs:64 msgid "Duration:" msgstr "Süre:" #: src/Gui/Widgets/Editors/VolumeEditor.cs:45 msgid "Backup" msgstr "Yedek" #: src/Gui/Widgets/Editors/VolumeEditor.cs:46 #: src/Gui/Widgets/CategoryView.cs:60 msgid "Documents" msgstr "Belgeler" #: src/Gui/Widgets/Editors/VolumeEditor.cs:47 #: src/Gui/Widgets/CategoryView.cs:61 msgid "Music" msgstr "Müzik" #: src/Gui/Widgets/Editors/VolumeEditor.cs:48 msgid "Audiobooks" msgstr "" #: src/Gui/Widgets/Editors/VolumeEditor.cs:49 #: src/Gui/Widgets/CategoryView.cs:62 msgid "Movies" msgstr "Filmler" #: src/Gui/Widgets/Editors/VolumeEditor.cs:50 msgid "Videos" msgstr "" #: src/Gui/Widgets/Editors/VolumeEditor.cs:51 msgid "Pictures" msgstr "Resimler" #: src/Gui/Widgets/Editors/VolumeEditor.cs:52 msgid "Games" msgstr "" #: src/Gui/Widgets/Editors/VolumeEditor.cs:53 src/Gui/Widgets/ItemInfo.cs:319 msgid "Software" msgstr "Yazılım" #: src/Gui/Widgets/Editors/VolumeEditor.cs:54 msgid "Misc" msgstr "Çeşitli" #: src/Gui/Widgets/Editors/VolumeEditor.cs:55 msgid "Other" msgstr "Diğer" #: src/Gui/Widgets/Editors/VolumeEditor.cs:225 msgid "Yes" msgstr "Evet" #: src/Gui/Widgets/Editors/VolumeEditor.cs:225 msgid "No" msgstr "Hayır" #: src/Gui/Widgets/Editors/VolumeEditor.cs:235 msgid "Volume type:" msgstr "" #: src/Gui/Widgets/Editors/VolumeEditor.cs:236 msgid "Hashed:" msgstr "" #: src/Gui/Widgets/Editors/VolumeEditor.cs:237 msgid "Added:" msgstr "Ekleme:" #: src/Gui/Widgets/Editors/VolumeEditor.cs:258 msgid "Archive No.:" msgstr "Arşiv Numarası:" #: src/Gui/Widgets/Editors/VolumeEditor.cs:260 msgid "Title:" msgstr "Başlık:" #: src/Gui/Widgets/Editors/VolumeEditor.cs:261 src/Gui/DBProperties.cs:98 msgid "Description:" msgstr "Açıklama:" #: src/Gui/Widgets/Editors/VolumeEditor.cs:262 msgid "Keywords:" msgstr "Anahtar kelimeler:" #: src/Gui/Widgets/Editors/VolumeEditor.cs:263 msgid "Loaned to:" msgstr "" #: src/Gui/Widgets/Editors/VolumeEditor.cs:264 msgid "Loaned date:" msgstr "" #: src/Gui/Widgets/Editors/VolumeEditor.cs:265 msgid "Return date:" msgstr "" #: src/Gui/Widgets/CategoryView.cs:58 msgid "Directories" msgstr "Dizinler" #: src/Gui/Widgets/CategoryView.cs:59 msgid "Text" msgstr "Metin" #: src/Gui/Widgets/CategoryView.cs:63 msgid "Images" msgstr "Görüntüler" #: src/Gui/Widgets/CategoryView.cs:64 msgid "Applications" msgstr "Uygulamalar" #: src/Gui/Widgets/CategoryView.cs:65 msgid "Archives" msgstr "Arşivler" #: src/Gui/Widgets/CategoryView.cs:66 msgid "Development" msgstr "Geliştirme" #: src/Gui/Widgets/CategoryView.cs:96 src/Gui/MainWindow.cs:1046 msgid "Category" msgstr "" #: src/Gui/Widgets/CategoryView.cs:128 msgid "All items" msgstr "Tüm Ögeler" #: src/Gui/Widgets/SearchResultView.cs:32 msgid "Volume" msgstr "" #: src/Gui/Widgets/SearchResultView.cs:33 src/Gui/MainWindow.cs:1040 msgid "Archive No." msgstr "Arşiv No." #: src/Gui/Widgets/ItemInfo.cs:40 msgid "by" msgstr "" #: src/Gui/Widgets/ItemInfo.cs:41 msgid "from" msgstr "" #: src/Gui/Widgets/ItemInfo.cs:196 msgid "Symlink target" msgstr "" #: src/Gui/Widgets/ItemInfo.cs:227 msgid "Track No." msgstr "Parça No." #: src/Gui/Widgets/ItemInfo.cs:258 msgid "Genre" msgstr "Tarz" #: src/Gui/Widgets/ItemInfo.cs:278 msgid "Year" msgstr "Yıl" #: src/Gui/Widgets/ItemInfo.cs:283 msgid "Description" msgstr "Tanım" #: src/Gui/Widgets/ItemInfo.cs:294 msgid "Dimensions" msgstr "Boyutlar" #: src/Gui/Widgets/ItemInfo.cs:299 msgid "Format" msgstr "Biçim" #: src/Gui/Widgets/ItemInfo.cs:303 msgid "Author" msgstr "Yazar" #: src/Gui/Widgets/ItemInfo.cs:307 msgid "Copyright" msgstr "Telif" #: src/Gui/Widgets/ItemInfo.cs:311 msgid "Producer" msgstr "Yapımcı" #: src/Gui/Widgets/ItemInfo.cs:315 msgid "Creator" msgstr "Oluşturan" #: src/Gui/Widgets/ItemInfo.cs:323 msgid "Language" msgstr "Dil" #: src/Gui/Widgets/ItemInfo.cs:327 msgid "Page count" msgstr "" #: src/Gui/Widgets/ItemInfo.cs:346 msgid "File count" msgstr "" #: src/Gui/Widgets/PageNavigation.cs:27 msgid "No items." msgstr "Öge yok." #: src/Gui/Widgets/PageNavigation.cs:145 #, csharp-format msgid "Page {0}/{1} ({2} - {3} of {4} items)" msgstr "" #: src/Gui/ObjectProperties.cs:54 src/Gui/VolumeScanner.cs:248 msgid "Invalid data" msgstr "Geçersiz veri" #: src/Gui/ObjectProperties.cs:54 src/Gui/VolumeScanner.cs:249 #, csharp-format msgid "" "\"{0}\" is {1}.\n" "\n" "Expected format: {2}\n" "Please correct or remove the data you entered." msgstr "" #: src/Gui/DBProperties.cs:85 msgid "Database Properties" msgstr "Veritabancı Özellikleri" #: src/Gui/DBProperties.cs:97 msgid "Name:" msgstr "İsim:" #: src/Gui/DBProperties.cs:99 msgid "Created:" msgstr "Oluşturuldu:" #: src/Gui/VolumeProperties.cs:29 msgid "Volume Properties" msgstr "" #: src/Gui/DriveSelection.cs:60 msgid "Waiting for drives..." msgstr "Sürücüler bekleniyor..." #: src/Gui/DriveSelection.cs:133 msgid "Drive" msgstr "Sürücü" #: src/Gui/DriveSelection.cs:139 msgid "Label" msgstr "Etiket" #: src/Gui/DriveSelection.cs:241 msgid "Please select a drive to scan" msgstr "Lütfen taramak için bir sürücü seçin" #: src/Gui/About.cs:28 msgid "A cross-platform media indexing/search tool." msgstr "" #: src/Gui/About.cs:29 #, csharp-format msgid "Using VolumeDB v{0}." msgstr "" #: src/Gui/About.cs:31 msgid "Copyright (c) " msgstr "Telif Hakkı (c) " #: src/Gui/ItemSearch.cs:81 #, csharp-format msgid "Found {0} items in {1:F3} seconds." msgstr "{1:F3} saniyede {0} öge bulundu." #: src/Gui/ItemSearch.cs:92 src/Gui/MainWindow.cs:519 msgid "Timeout: another search is probably still in progress." msgstr "" #: src/Gui/ItemSearch.cs:94 msgid "Too many search results. Please refine your search criteria." msgstr "" #: src/Gui/ItemSearch.cs:112 src/Gui/MainWindow.cs:535 msgid "Searching..." msgstr "Aranıyor..." #: src/Gui/ItemSearch.cs:267 msgid "Search Items" msgstr "" #: src/Gui/ItemSearch.cs:279 src/Gui/MainWindow.cs:1145 msgid "default" msgstr "" #: src/Gui/ItemSearch.cs:283 msgid "Search items" msgstr "" #: src/Gui/ItemSearch.cs:318 msgid "Quick tip:" msgstr "" #: src/Gui/ItemSearch.cs:319 #, csharp-format msgid "" "Click on the icon to the left of the search field to build advanced search " "queries.\n" "Example: {0}" msgstr "" #: src/Gui/ItemSearch.cs:326 msgid "No search results." msgstr "" #: src/Gui/ItemSearch.cs:375 src/Gui/MainWindow.cs:1028 msgid "Edit Item" msgstr "Ögeyi Düzenle" #: src/Gui/ItemSearch.cs:382 msgid "Show in Main Window" msgstr "" #: src/Gui/MainWindow.cs:77 src/Gui/MainWindow.cs:93 src/Gui/MainWindow.cs:635 #, csharp-format msgid "Database '{0}' not found." msgstr "Veritabanı '{0}' bulunamadı." #: src/Gui/MainWindow.cs:185 msgid "Database not found" msgstr "Veritabanı bulunamadı" #: src/Gui/MainWindow.cs:186 msgid "Default database not found. Create?" msgstr "Öntanımlı veritabanı bulunamadı. Oluştur?" #: src/Gui/MainWindow.cs:215 msgid "Unsupported database version" msgstr "Desteklenmeyen veritabanı sürümü" #: src/Gui/MainWindow.cs:216 msgid "This database version is not supported." msgstr "Bu veritabanı sürümü desteklenmiyor." #: src/Gui/MainWindow.cs:235 #, csharp-format msgid "{0} volumes loaded." msgstr "" #: src/Gui/MainWindow.cs:256 #, csharp-format msgid "An error occured while loading the volume list: {0}" msgstr "" #: src/Gui/MainWindow.cs:300 msgid "Please enter the name for the new database" msgstr "Yeni veritabanı için lütfen bir isim girin" #: src/Gui/MainWindow.cs:312 msgid "Database exists" msgstr "Veritabanı mevcut" #: src/Gui/MainWindow.cs:313 msgid "Database already exists. Overwrite?" msgstr "Veritabanı zaten mevcut. Üzerine yaz?" #: src/Gui/MainWindow.cs:326 msgid "Please select a database" msgstr "Lütfen bir veritabanı seçin" #: src/Gui/MainWindow.cs:335 src/Gui/Import.cs:83 msgid "Database not found." msgstr "Veritabını bulunamadı" #: src/Gui/MainWindow.cs:356 #, csharp-format msgid "" "An error occured while accessing drive {0}:\n" "{1}" msgstr "" #: src/Gui/MainWindow.cs:378 #, csharp-format msgid "Drive {0} is not ready." msgstr "{0} sürücüsü hazır değil." #: src/Gui/MainWindow.cs:387 #, csharp-format msgid "Drive {0} is neither mounted nor does it contain an audio cd." msgstr "" #: src/Gui/MainWindow.cs:406 msgid "Confirmation" msgstr "Doğrulama" #: src/Gui/MainWindow.cs:407 msgid "Are you sure you really want to remove the selected volume?" msgstr "" #: src/Gui/MainWindow.cs:712 #, csharp-format msgid "Please insert volume '{0}'." msgstr "" #: src/Gui/MainWindow.cs:714 msgid "Waiting for volume" msgstr "" #: src/Gui/MainWindow.cs:966 msgid "Add Volume" msgstr "" #: src/Gui/MainWindow.cs:970 msgid "Search" msgstr "" #: src/Gui/MainWindow.cs:973 msgid "App Menu" msgstr "" #: src/Gui/MainWindow.cs:979 msgid "_New Database" msgstr "_Yeni Veritabanı" #: src/Gui/MainWindow.cs:982 msgid "_Open Database" msgstr "Veritabanı _Aç" #: src/Gui/MainWindow.cs:985 msgid "Open Default Database" msgstr "Öntanımlı Veritabanını Aç" #: src/Gui/MainWindow.cs:991 msgid "Recent Databases" msgstr "Şu Anki Veritabanı" #: src/Gui/MainWindow.cs:998 msgid "_Import" msgstr "_İçe aktar" #: src/Gui/MainWindow.cs:1001 msgid "_Preferences" msgstr "_Tercihler" #: src/Gui/MainWindow.cs:1004 msgid "_Database Properties" msgstr "_Veritabanı Özellikleri" #: src/Gui/MainWindow.cs:1007 msgid "Info" msgstr "" #: src/Gui/MainWindow.cs:1010 msgid "_Quit" msgstr "_Çık" #: src/Gui/MainWindow.cs:1016 msgid "_Edit Volume" msgstr "" #: src/Gui/MainWindow.cs:1019 msgid "_Remove Volume" msgstr "" #: src/Gui/MainWindow.cs:1022 msgid "Rescan Volume" msgstr "" #: src/Gui/MainWindow.cs:1034 msgid "Sort by" msgstr "" #: src/Gui/MainWindow.cs:1037 msgid "Descending" msgstr "" #: src/Gui/MainWindow.cs:1043 msgid "Date added" msgstr "" #: src/Gui/MainWindow.cs:1044 msgid "Title" msgstr "" #: src/Gui/MainWindow.cs:1045 msgid "Drivetype" msgstr "" #: src/Gui/MainWindow.cs:1142 msgid "Filter volumes" msgstr "" #: src/Gui/Import.cs:29 msgid "Import" msgstr "İçe aktar" #: src/Gui/Import.cs:30 msgid "Abort" msgstr "Bitirmeden durdur" #: src/Gui/Import.cs:31 msgid "Please select a database." msgstr "" #: src/Gui/Import.cs:72 #, csharp-format msgid "{0:0}% completed." msgstr "%{0:0} tamamlandı." #: src/Gui/Import.cs:82 msgid "Import failed" msgstr "İçe aktarma başarısız oldu" #: src/Gui/Import.cs:85 msgid "Import failed!" msgstr "İçe aktarma başarısız oldu" #: src/Gui/Import.cs:87 msgid "Import aborted." msgstr "İçe aktarma tamamlanmadan durduruldu." #: src/Gui/Import.cs:89 msgid "Import completed successfully." msgstr "İçe aktarma başarılı bir şekilde tamamlandı" #: src/Gui/Import.cs:121 msgid "Import in progress" msgstr "İçe aktarma devam ediyor" #: src/Gui/Import.cs:122 msgid "You must stop the import before closing this window." msgstr "" #: src/Gui/Import.cs:148 msgid "Unknown format." msgstr "" #: src/Gui/Import.cs:175 msgid "Import Database" msgstr "Veritabanı Al" #: src/Gui/Import.cs:186 msgid "Please select a database to import" msgstr "İçe aktarmak için lütfen bir veritabanı seçin" #: src/Gui/Import.cs:194 msgid "All supported formats" msgstr "" #: src/Gui/Import.cs:198 #, csharp-format msgid ".{0} files" msgstr "" #: src/Gui/Import.cs:209 msgid "Database:" msgstr "Veritabanı:" #: src/Gui/Import.cs:210 msgid "Format:" msgstr "Format:" #: src/Gui/ItemProperties.cs:29 msgid "Item Properties" msgstr "Öge Özellikleri" #: src/Gui/VolumeScanner.cs:116 msgid "Scanning started." msgstr "Tarama başlatıldı." #: src/Gui/VolumeScanner.cs:118 #, csharp-format msgid "Scanning of drive '{0}' started." msgstr "" #: src/Gui/VolumeScanner.cs:124 #, csharp-format msgid "" "Options: generate thumbs: {0}, extract metadata: {1}, discard symlinks: {2}, " "hashing: {3}." msgstr "" #: src/Gui/VolumeScanner.cs:131 #, csharp-format msgid "Options: MusicBrainz enabled: {0}" msgstr "" #: src/Gui/VolumeScanner.cs:157 msgid "Time" msgstr "Süre" #: src/Gui/VolumeScanner.cs:161 msgid "Message" msgstr "İleti" #: src/Gui/VolumeScanner.cs:258 msgid "Stopping Scanner and performing rollback..." msgstr "" #: src/Gui/VolumeScanner.cs:268 msgid "yes" msgstr "evet" #: src/Gui/VolumeScanner.cs:268 msgid "no" msgstr "hayır" #: src/Gui/VolumeScanner.cs:291 msgid "Scan in progress" msgstr "" #: src/Gui/VolumeScanner.cs:291 msgid "You must stop scanning before closing this window." msgstr "" #: src/Gui/VolumeScanner.cs:346 #, csharp-format msgid "An unhandled exception occured ({0})." msgstr "" #: src/Gui/VolumeScanner.cs:347 msgid "All database changes have been rolled back." msgstr "" #: src/Gui/VolumeScanner.cs:354 #, csharp-format msgid "Scanning failed. Reason: an unhandled exception occured ({0})." msgstr "" #: src/Gui/VolumeScanner.cs:356 msgid "Scanning aborted." msgstr "Tarama iptal edildi." #: src/Gui/VolumeScanner.cs:358 msgid "Scanning completed successfully." msgstr "Tarama başarıyla tamamlandı." #: src/Gui/VolumeScanner.cs:488 msgid "VolumeScanner" msgstr "" #: src/Gui/VolumeScanner.cs:500 msgid "Volume Information:" msgstr "" #: src/Gui/VolumeScanner.cs:510 msgid "Scanner Log:" msgstr "Tarayıcı Kaydı:" #: src/Gui/VolumeScanner.cs:527 msgid "Database access" msgstr "Veritabanı erişimi" #: src/Gui/Preferences.cs:119 msgid "None" msgstr "Hiçbiri" #: src/Gui/Preferences.cs:228 msgid "Unsupported theme" msgstr "" #: src/Gui/Preferences.cs:229 msgid "The selected icon theme is currently not supported on your system." msgstr "" #: src/Gui/Preferences.cs:267 msgid "Restart required" msgstr "Yeniden başlatma gerekiyor" #: src/Gui/Preferences.cs:268 #, csharp-format msgid "You must restart {0} for icontheme changes to take effect." msgstr "" #: src/Gui/Preferences.cs:298 msgid "Preferences" msgstr "Tercihler" #: src/Gui/Preferences.cs:322 msgid "_Load Defaults" msgstr "Öntanımlı Ayarları _Yükle" #: src/Gui/Preferences.cs:349 msgid "Icon theme:" msgstr "Simge teması:" #: src/Gui/Preferences.cs:355 msgid "Reopen most recent database on startup" msgstr "" #: src/Gui/Preferences.cs:359 msgid "Show iteminfo panel" msgstr "" #: src/Gui/Preferences.cs:363 msgid "Show hidden files" msgstr "" #: src/Gui/Preferences.cs:367 msgid "Show thumbnails in the filebrowser" msgstr "" #: src/Gui/Preferences.cs:370 msgid "General" msgstr "Genel" #: src/Gui/Preferences.cs:378 msgid "Don't prompt, always scan:" msgstr "" #: src/Gui/Preferences.cs:397 msgid "Generate Thumbnails" msgstr "" #: src/Gui/Preferences.cs:401 msgid "Extract metadata" msgstr "" #: src/Gui/Preferences.cs:405 msgid "Discard symbolic links" msgstr "" #: src/Gui/Preferences.cs:409 msgid "Compute hashcodes for files (slow!)" msgstr "" #: src/Gui/Preferences.cs:413 msgid "Fetch audio cd metadata from MusicBrainz.org" msgstr "" #: src/Gui/Preferences.cs:416 msgid "Scanner" msgstr "Tarayıcı" Basenji/po/it.resources0000664000175000017500000003320012067326706015304 0ustar patrickpatricklSystem.Resources.ResourceReader, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089#System.Resources.RuntimeResourceSetPADPADP̯[\ĒZFn_`/+ܽێyB_2 bJ䗖x~?ޘ ǚ˚}朮G  +Iљ,ޠ}ѬX`pѨE7kݏѝ!峸/# *?8 ڻMo;,锼xb5x,Qoĵgsv59}΍\$о DaрO51 թ}&ٍɬڴn^/gk䷧p$dF>?y7 Taq;͈nYDoY`rYrY$sYsYStYj~Ԕx06ez Z P4 * J  o> 8a c iz $ |q c O\mga}AKuQ>R j!ز$&P%%*U++1;v9`9vE:Iu:>Y@;CBsDH1L2Q;RfMSMeS@STXmޡY![[Page {0}/{1}</b> ({2} - {3} of {4} items)&<b>Scanner Log:</b>"4<b>Volume Information:</b>BXA cross-platform media indexing/search tool._ Abort Added:VAll database changes have been rolled back.All filesAll items^An error occured while accessing drive {0}: {1}fAn error occured while loading the volume list: {0}WJAn unhandled exception occured ({0}).ApplicationsArchive No.Archive No.:ArchivesvAre you sure you really want to remove the selected volume? Artist8Audio CDAAudio CD trackKAudiobooks] Authori Backupq BytesyCategoryCategory:FCompute hashcodes for files (slow!)ConfirmationCopyrightCopyright (c) Created:Creator2Database '{0}' not found.&Database PropertiesDatabase access-FDatabase already exists. Overwrite?BDatabase existsf$Database not foundz&Database not found.Database:Date addedFDefault database not found. Create?DescendingDescriptionDescription:DevelopmentDimensions$Directories0Directories::DirectoryE,Discard symbolic linksODocumentsg4Don't prompt, always scan:r DrivezDrive {0} is neither mounted nor does it contain an audio cd..Drive {0} is not ready.DrivetypeDurationDuration:Edit Item  Error3 Extract metadata;XFetch audio cd metadata from MusicBrainz.orgNFileFile count Files:FilesystemFiletypeFilter volumes FormatFormat:DFound {0} items in {1:F3} seconds.GB Games General&Generate Thumbnails Genre/Hash7Hashed:=Icon theme:D ImagesW ImportaImport DatabaseoImport aborted. POT-Creation-Date: 2012-07-15 15:49+0200 PO-Revision-Date: 2011-11-13 17:34+0000 Last-Translator: Fidel Nadera Language-Team: Italian MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Launchpad-Export-Date: 2012-10-27 11:00+0000 X-Generator: Launchpad (build 16194) J"{0}" è {1}. Formato atteso: {2} Correggere o rimuovere i dati inseriti.(vuoto)2Pagina {0}/{1} ({2} - {3} di {4} elementi)Registro dello scanner:Informazione volume:@Indicizzazione della piattaforme-incrociate/strumento di ricerca Interrompi Aggiunto:5Tutti i cambiamenti al database sono stati annullati. Tutti i fileTutti gli elementiDSi è verificato un errore durante l'accesso al dispositivo {0}: {1}MSi è verificato un errore durante il caricamento della lista dei volumi: {0}0Si é verificata un'eccezione non gestita ({0}). ApplicazioniArchivioArchive:Archivi3Confermare la cancellazione del volume selezionato?ArtistaCD audioTraccia CD audio AudiolibriAutoreBackupbyte Categoria Categoria:)Calcolare codice hash per i file (lento!)Conferma CopyrightCopyright (c) Creato:AutoreDatabase '{0}' non trovato.Proprietà del databaseAccesso al database"Database esistente. Sovrascrivere?Database esistenteDatabase non trovatoDatabase non trovato Database: Data aggiunta*Database predefinito non trovato. Crearlo? Decrescente Descrizione Descrizione:Programmazione DimensioniCartelle Cartelle:CartellaEscludere collegamenti Documenti!Non chiedere, scansionare sempre: Dispositivo:Dispositivo {0} non è montato o non contiene un audio cd. Dispositivo {0} non disponibile. Tipo di driveDurataDurata:Modifica elementoErroreEstrarre metadati2Prelevare metadati per audio cd da MusicBrainz.orgFileConteggio fileFile: File system Tipo di file Filtra volumiFormatoFormato:'Trovati {0} elementi in {1:F3} secondi.GBGiochiGeneraleGenerare anteprimeGenereHashHash:Tema delle icone:Immagini ImportazioneImportazione databaseImportazione interrotta.%Importazione completata con successo.Importazione fallitaImportazione non riuscita!Importazione in corsoDati non validiProprietà dell'elemento Tipo elementokB Parole chiaveParole chiave: EtichettaLinguaUltima scritturaCaricamento...Data prestito: Prestato a: PosizioneMB MessaggioVarieFilmatiMusicaNomeNome:NoNessun elemento.Nessun risultato.Nessuno AnnotazioniApri database predefinito NomeOpzione#Opzioni: MusicBrainz abilitato: {0}_Opzioni: generare anteprime: {0}, estrarre metadati: {1}, scartare symlinks: {2}, hashing: {3}.AltroConteggio pagineImmagini#Inserire il nome del nuovo databaseSelezionare un database"Seleziona un database da importare)Selezionare un dispositivo da scansionare Preferenze ProduttoreDatabase recenti-All'avvio aprire l'ultimo database utilizzatoRiavvio richiestoData di ritorno:Scansione in corsoScannerScansione interrotta."Scansione completata con successo.JScansione fallita. Causa: si é verificata un'eccezione non gestita ({0}).)Scansione del dispositivo '{0}' iniziata.Scansione iniziata.Cerca elementi Cerca oggettiRicerca in corso...Mostra file nascostiMostra il pannello iteminfo Mostra anteprime nel filebrowser DimensioniSoftware Ordina per,Interruzione della scansione e ripristino...Destinazione del collegamentoTBTestoKIl tema di icone selezionato non è attualmente supportato sul tuo sistema..Questa versione del database non è supportataDurata3Timeout: un'altra ricerca potrebbe essere in corso.TitoloTitolo:;Troppi risultati di ricerca. Affinare i criteri di ricerca.Dimensione totale: Traccia Num.Brani:Tipo Sconosciuto Senza nome$Versione del database non supportataTema non supportatoUtilizza VolumeDB v{0}.VideoVolumeProprietà del volumeTipo di volume:File VolumeDatabase VolumeScannerIn attesa dei dispositivi...AnnoSì;Riavvia {0} per applicare le modifiche al tema delle icone.Interrompere l'importazione prima di chiudere questa finestra._Proprietà database_Modifica volume_ImportaCarica i valori predefiniti_Nuovo database_Apri database _Preferenze_Esci_Rimuovi volumedi predefinitofiledanotraccesì{0:0}% completato.{0} byte{0} è in esecuzione.{0} volumi caricati.Basenji/po/zh_CN.resources0000664000175000017500000001460112067326706015675 0ustar patrickpatricklSystem.Resources.ResourceReader, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089#System.Resources.RuntimeResourceSetxPADPADPĒZFn`ܽێyB_2䗖x~˚G +I,ޠѬX`E7kݏѝ/ *?ڻ,锼5x,Qo}΍ξ DЀ}&֍ɬڴn^/g䷧p$dF>?y7 Taq͈nYDoYrY$sYsY* J  o> 8a c iz $ |q c Oga}Q>R j!*;v9`9>Y@;CBsDH1L2Q;RMeS![[_㦍afZgj[l먗m8npLsKt8uuxUuxjvqWx;n|~|q|}$|xT|*#|~%# W @ R sJ = |Y[st n1<+ ~  m 6 V S{<   f @ CdJl^ t    ]    >K ,8Q wo Q 3 Z<b>Page {0}/{1}</b> ({2} - {3} of {4} items) Abort Added:All filesApplicationsArchive No.:Archives ArtistAudio CD*Audio CD track4AudiobooksD AuthorO BackupW Bytes_ConfirmationgCopyrightoCopyright (c) wCreated:Creator&Database PropertiesFDatabase already exists. Overwrite?Database exists&Database not found.Database:Date addedDescending!Description)Description:1Dimensions:Directories:BDirectoryPDocuments[4Don't prompt, always scan:c DriveDrivetypeDurationDuration:Edit Item Error Extract metadataFileFile countFilesystemFiletypeFilter volumes Format Format: Games&Generate Thumbnails& Genre7Icon theme:? ImagesP ImportXImport Database`Import aborted.q POT-Creation-Date: 2012-07-15 15:49+0200 PO-Revision-Date: 2010-12-12 23:42+0000 Last-Translator: Li Jin Language-Team: Chinese (Simplified) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Launchpad-Export-Date: 2012-10-27 11:00+0000 X-Generator: Launchpad (build 16194) +页 {0}/{1} ({2} - {3} 共 {4} 项)中止 已添加: 所有文件程序存档编号:存档 艺术家音频CD音频CD音轨 有声书作者备份字节确认版权版权所有 (c) 创建时间: 创建人数据库属性$数据库已存在。是否覆盖?数据库已存在数据库不存在 数据库: 添加日期递减描述描述:尺寸 文件夹: 文件夹文档不要提示,总是扫描: 驱动器 磁盘类型时长 时长: 编辑项错误提取元数据文件 文件数 文件系统 文件类型 过滤卷格式格式:游戏生成缩略图流派图标主题:图像导入导入数据库导入已取消。成功完成导入。 导入失败导入失败!导入进行中 数据无效KB 关键词 关键词:卷标语言上次写入时间 载入中... 租给:位置 兆字节杂项电影音乐取消没有搜索结果。打开默认数据库 选项名其它页数图片请选择数据库请选择要导入的数据库请选择要扫描的磁盘 首选项 制作人!启动时打开最近的数据库需要重新启动 正在扫描扫描已取消。 搜索项目正在搜索......软件文本标题标题: 总大小:类型未知 未命名视频 音量属性等待驱动器...年份确定$关闭窗口前必须停止导入。数据库属性(_D) 编辑卷(_E) 导入(_I)加载默认值(_L)打开数据库(_O) 首选项(_P) 退出 (_Q) 移除卷(_R)由从否曲目是{0} 已在运行中。Basenji/po/oc.po0000664000175000017500000004747112067326706013714 0ustar patrickpatrick# Occitan (post 1500) translation for basenji # Copyright (c) 2010 Rosetta Contributors and Canonical Ltd 2010 # This file is distributed under the same license as the basenji package. # FIRST AUTHOR , 2010. # msgid "" msgstr "" "Project-Id-Version: basenji\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2012-07-15 15:49+0200\n" "PO-Revision-Date: 2011-09-03 17:35+0000\n" "Last-Translator: Cédric VALMARY (Tot en òc) \n" "Language-Team: Occitan (post 1500) \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2012-10-27 11:00+0000\n" "X-Generator: Launchpad (build 16194)\n" #: src/Util.cs:30 #, csharp-format msgid "{0} Bytes" msgstr "{0} Octets" #: src/Util.cs:32 msgid "Bytes" msgstr "Octets" #: src/Util.cs:32 msgid "KB" msgstr "Kio" #: src/Util.cs:32 msgid "MB" msgstr "Mio" #: src/Util.cs:32 msgid "GB" msgstr "Gio" #: src/Util.cs:32 msgid "TB" msgstr "Tio" #: src/Options.cs:477 msgid "OptionName" msgstr "Nom de l'opcion" #: src/FileDialog.cs:51 msgid "VolumeDatabase files" msgstr "Fichièrs VolumeDatabase" #: src/FileDialog.cs:56 msgid "All files" msgstr "Totes los fichièrs" #: src/Main.cs:142 src/Gui/MainWindow.cs:76 src/Gui/MainWindow.cs:92 #: src/Gui/MainWindow.cs:334 src/Gui/MainWindow.cs:355 #: src/Gui/MainWindow.cs:377 src/Gui/MainWindow.cs:386 #: src/Gui/MainWindow.cs:635 msgid "Error" msgstr "Error" #: src/Main.cs:142 #, csharp-format msgid "{0} is already running." msgstr "{0} es en cors de tractament." #: src/Gui/Widgets/VolumeView.cs:42 src/Gui/Widgets/SearchResultView.cs:30 msgid "Unnamed" msgstr "Sens nom" #: src/Gui/Widgets/VolumeView.cs:43 #: src/Gui/Widgets/Editors/VolumeEditor.cs:259 msgid "Category:" msgstr "Categoria :" #: src/Gui/Widgets/VolumeView.cs:44 msgid "files" msgstr "fichièrs" #: src/Gui/Widgets/VolumeView.cs:45 msgid "tracks" msgstr "pistas" #: src/Gui/Widgets/ItemView.cs:29 msgid "Loading..." msgstr "Cargament en cors..." #: src/Gui/Widgets/ItemView.cs:30 msgid "(empty)" msgstr "(void)" #: src/Gui/Widgets/ItemView.cs:99 src/Gui/DriveSelection.cs:80 msgid "Unknown" msgstr "Desconegut" #: src/Gui/Widgets/ItemView.cs:170 src/Gui/Widgets/Editors/ItemEditor.cs:96 msgid "Name" msgstr "Nom" #: src/Gui/Widgets/ItemView.cs:176 msgid "Artist" msgstr "Artista" #: src/Gui/Widgets/ItemView.cs:181 #: src/Gui/Widgets/Editors/AudioTrackItemEditor.cs:53 #: src/Gui/Widgets/ItemInfo.cs:225 src/Gui/Widgets/ItemInfo.cs:288 msgid "Duration" msgstr "Durada" #: src/Gui/Widgets/Editors/FileSystemVolumeEditor.cs:34 #: src/Gui/DriveSelection.cs:168 msgid "Filesystem" msgstr "Sistèma de fichièrs" #: src/Gui/Widgets/Editors/FileSystemVolumeEditor.cs:65 msgid "Files:" msgstr "Fichièrs :" #: src/Gui/Widgets/Editors/FileSystemVolumeEditor.cs:66 msgid "Directories:" msgstr "Dorsièrs :" #: src/Gui/Widgets/Editors/FileSystemVolumeEditor.cs:67 msgid "Total size:" msgstr "Talha totala :" #: src/Gui/Widgets/Editors/ItemEditor.cs:95 msgid "Item type" msgstr "Tipe d'element" #: src/Gui/Widgets/Editors/ItemEditor.cs:111 src/Gui/Widgets/ItemInfo.cs:371 msgid "Note" msgstr "Nòta" #: src/Gui/Widgets/Editors/ItemEditor.cs:112 src/Gui/Widgets/ItemInfo.cs:374 msgid "Keywords" msgstr "Mots claus" #: src/Gui/Widgets/Editors/AudioTrackItemEditor.cs:31 #: src/Gui/Widgets/SearchResultView.cs:34 msgid "Audio CD track" msgstr "Pista CD Àudio" #: src/Gui/Widgets/Editors/AudioTrackItemEditor.cs:54 #: src/Gui/Widgets/ItemInfo.cs:230 msgid "Type" msgstr "Tipe" #: src/Gui/Widgets/Editors/DirectoryItemEditor.cs:28 msgid "Directory" msgstr "Dorsièr" #: src/Gui/Widgets/Editors/FileSystemItemEditor.cs:59 #: src/Gui/Widgets/SearchResultView.cs:31 src/Gui/Widgets/ItemInfo.cs:183 msgid "Location" msgstr "Emplaçament" #: src/Gui/Widgets/Editors/FileSystemItemEditor.cs:60 #: src/Gui/Widgets/ItemInfo.cs:185 msgid "Last write time" msgstr "Darrièr enregistrament" #: src/Gui/Widgets/Editors/FileSystemItemEditor.cs:61 #: src/Gui/Widgets/ItemInfo.cs:210 msgid "Filetype" msgstr "Tipe de fichièr" #: src/Gui/Widgets/Editors/FileItemEditor.cs:31 msgid "File" msgstr "Fichièr" #: src/Gui/Widgets/Editors/FileItemEditor.cs:52 #: src/Gui/Widgets/ItemInfo.cs:204 src/Gui/Widgets/ItemInfo.cs:226 #: src/Gui/DriveSelection.cs:148 msgid "Size" msgstr "Talha" #: src/Gui/Widgets/Editors/FileItemEditor.cs:53 #: src/Gui/Widgets/ItemInfo.cs:206 msgid "Hash" msgstr "Emprencha" #: src/Gui/Widgets/Editors/AudioCdVolumeEditor.cs:33 msgid "Audio CD" msgstr "CD àudio" #: src/Gui/Widgets/Editors/AudioCdVolumeEditor.cs:63 msgid "Tracks:" msgstr "Pistas :" #: src/Gui/Widgets/Editors/AudioCdVolumeEditor.cs:64 msgid "Duration:" msgstr "Durada :" #: src/Gui/Widgets/Editors/VolumeEditor.cs:45 msgid "Backup" msgstr "Salvament" #: src/Gui/Widgets/Editors/VolumeEditor.cs:46 #: src/Gui/Widgets/CategoryView.cs:60 msgid "Documents" msgstr "Documents" #: src/Gui/Widgets/Editors/VolumeEditor.cs:47 #: src/Gui/Widgets/CategoryView.cs:61 msgid "Music" msgstr "Musica" #: src/Gui/Widgets/Editors/VolumeEditor.cs:48 msgid "Audiobooks" msgstr "Libres àudio" #: src/Gui/Widgets/Editors/VolumeEditor.cs:49 #: src/Gui/Widgets/CategoryView.cs:62 msgid "Movies" msgstr "Filmes" #: src/Gui/Widgets/Editors/VolumeEditor.cs:50 msgid "Videos" msgstr "Vidèos" #: src/Gui/Widgets/Editors/VolumeEditor.cs:51 msgid "Pictures" msgstr "Imatges" #: src/Gui/Widgets/Editors/VolumeEditor.cs:52 msgid "Games" msgstr "Jòcs" #: src/Gui/Widgets/Editors/VolumeEditor.cs:53 src/Gui/Widgets/ItemInfo.cs:319 msgid "Software" msgstr "Logicial" #: src/Gui/Widgets/Editors/VolumeEditor.cs:54 msgid "Misc" msgstr "Divèrs" #: src/Gui/Widgets/Editors/VolumeEditor.cs:55 msgid "Other" msgstr "Autre" #: src/Gui/Widgets/Editors/VolumeEditor.cs:225 msgid "Yes" msgstr "Òc" #: src/Gui/Widgets/Editors/VolumeEditor.cs:225 msgid "No" msgstr "Non" #: src/Gui/Widgets/Editors/VolumeEditor.cs:235 msgid "Volume type:" msgstr "Tipe de mèdia :" #: src/Gui/Widgets/Editors/VolumeEditor.cs:236 msgid "Hashed:" msgstr "Emprencha :" #: src/Gui/Widgets/Editors/VolumeEditor.cs:237 msgid "Added:" msgstr "Apondut :" #: src/Gui/Widgets/Editors/VolumeEditor.cs:258 msgid "Archive No.:" msgstr "N° d'archiu :" #: src/Gui/Widgets/Editors/VolumeEditor.cs:260 msgid "Title:" msgstr "Títol :" #: src/Gui/Widgets/Editors/VolumeEditor.cs:261 src/Gui/DBProperties.cs:98 msgid "Description:" msgstr "Descripcion :" #: src/Gui/Widgets/Editors/VolumeEditor.cs:262 msgid "Keywords:" msgstr "Mots claus :" #: src/Gui/Widgets/Editors/VolumeEditor.cs:263 msgid "Loaned to:" msgstr "Prestats a :" #: src/Gui/Widgets/Editors/VolumeEditor.cs:264 msgid "Loaned date:" msgstr "Data de prèst :" #: src/Gui/Widgets/Editors/VolumeEditor.cs:265 msgid "Return date:" msgstr "Data de retorn :" #: src/Gui/Widgets/CategoryView.cs:58 msgid "Directories" msgstr "Dorsièrs" #: src/Gui/Widgets/CategoryView.cs:59 msgid "Text" msgstr "Tèxte" #: src/Gui/Widgets/CategoryView.cs:63 msgid "Images" msgstr "Imatges" #: src/Gui/Widgets/CategoryView.cs:64 msgid "Applications" msgstr "Aplicacions" #: src/Gui/Widgets/CategoryView.cs:65 msgid "Archives" msgstr "Archius" #: src/Gui/Widgets/CategoryView.cs:66 msgid "Development" msgstr "Desvolopament" #: src/Gui/Widgets/CategoryView.cs:96 src/Gui/MainWindow.cs:1046 msgid "Category" msgstr "Categoria" #: src/Gui/Widgets/CategoryView.cs:128 msgid "All items" msgstr "Totes los objèctes" #: src/Gui/Widgets/SearchResultView.cs:32 msgid "Volume" msgstr "Volum" #: src/Gui/Widgets/SearchResultView.cs:33 src/Gui/MainWindow.cs:1040 msgid "Archive No." msgstr "N° d'Archiu" #: src/Gui/Widgets/ItemInfo.cs:40 msgid "by" msgstr "per" #: src/Gui/Widgets/ItemInfo.cs:41 msgid "from" msgstr "de" #: src/Gui/Widgets/ItemInfo.cs:196 msgid "Symlink target" msgstr "destinacion del ligam" #: src/Gui/Widgets/ItemInfo.cs:227 msgid "Track No." msgstr "N° de Pista" #: src/Gui/Widgets/ItemInfo.cs:258 msgid "Genre" msgstr "Genre" #: src/Gui/Widgets/ItemInfo.cs:278 msgid "Year" msgstr "Annada" #: src/Gui/Widgets/ItemInfo.cs:283 msgid "Description" msgstr "Descripcion" #: src/Gui/Widgets/ItemInfo.cs:294 msgid "Dimensions" msgstr "Dimensions" #: src/Gui/Widgets/ItemInfo.cs:299 msgid "Format" msgstr "Format" #: src/Gui/Widgets/ItemInfo.cs:303 msgid "Author" msgstr "Autor" #: src/Gui/Widgets/ItemInfo.cs:307 msgid "Copyright" msgstr "Dreches d'autor" #: src/Gui/Widgets/ItemInfo.cs:311 msgid "Producer" msgstr "Productor" #: src/Gui/Widgets/ItemInfo.cs:315 msgid "Creator" msgstr "Creator" #: src/Gui/Widgets/ItemInfo.cs:323 msgid "Language" msgstr "Lenga" #: src/Gui/Widgets/ItemInfo.cs:327 msgid "Page count" msgstr "Nombre de paginas" #: src/Gui/Widgets/ItemInfo.cs:346 msgid "File count" msgstr "Nombre de fichièrs" #: src/Gui/Widgets/PageNavigation.cs:27 msgid "No items." msgstr "Pas cap d'objècte." #: src/Gui/Widgets/PageNavigation.cs:145 #, csharp-format msgid "Page {0}/{1} ({2} - {3} of {4} items)" msgstr "Pagina {0}/{1} ({2} - {3} sus {4} objèctes)" #: src/Gui/ObjectProperties.cs:54 src/Gui/VolumeScanner.cs:248 msgid "Invalid data" msgstr "Donada invalida" #: src/Gui/ObjectProperties.cs:54 src/Gui/VolumeScanner.cs:249 #, csharp-format msgid "" "\"{0}\" is {1}.\n" "\n" "Expected format: {2}\n" "Please correct or remove the data you entered." msgstr "" #: src/Gui/DBProperties.cs:85 msgid "Database Properties" msgstr "Proprietats de la banca de donadas" #: src/Gui/DBProperties.cs:97 msgid "Name:" msgstr "Nom :" #: src/Gui/DBProperties.cs:99 msgid "Created:" msgstr "Creat lo :" #: src/Gui/VolumeProperties.cs:29 msgid "Volume Properties" msgstr "Proprietats del Mèdia" #: src/Gui/DriveSelection.cs:60 msgid "Waiting for drives..." msgstr "Espèra dels lectors..." #: src/Gui/DriveSelection.cs:133 msgid "Drive" msgstr "Lector" #: src/Gui/DriveSelection.cs:139 msgid "Label" msgstr "Etiqueta" #: src/Gui/DriveSelection.cs:241 msgid "Please select a drive to scan" msgstr "Seleccionatz lo lector d'analisar" #: src/Gui/About.cs:28 msgid "A cross-platform media indexing/search tool." msgstr "" #: src/Gui/About.cs:29 #, csharp-format msgid "Using VolumeDB v{0}." msgstr "Utilizatz VolumeDB v{0}." #: src/Gui/About.cs:31 msgid "Copyright (c) " msgstr "Copyright (c) " #: src/Gui/ItemSearch.cs:81 #, csharp-format msgid "Found {0} items in {1:F3} seconds." msgstr "Trobat {0} objèctes en {1:F3} segondas." #: src/Gui/ItemSearch.cs:92 src/Gui/MainWindow.cs:519 msgid "Timeout: another search is probably still in progress." msgstr "" #: src/Gui/ItemSearch.cs:94 msgid "Too many search results. Please refine your search criteria." msgstr "" #: src/Gui/ItemSearch.cs:112 src/Gui/MainWindow.cs:535 msgid "Searching..." msgstr "Recèrca en cors..." #: src/Gui/ItemSearch.cs:267 msgid "Search Items" msgstr "Objèctes recercats" #: src/Gui/ItemSearch.cs:279 src/Gui/MainWindow.cs:1145 msgid "default" msgstr "per defaut" #: src/Gui/ItemSearch.cs:283 msgid "Search items" msgstr "" #: src/Gui/ItemSearch.cs:318 msgid "Quick tip:" msgstr "" #: src/Gui/ItemSearch.cs:319 #, csharp-format msgid "" "Click on the icon to the left of the search field to build advanced search " "queries.\n" "Example: {0}" msgstr "" #: src/Gui/ItemSearch.cs:326 msgid "No search results." msgstr "Pas cap de resultat de recèrca." #: src/Gui/ItemSearch.cs:375 src/Gui/MainWindow.cs:1028 msgid "Edit Item" msgstr "Modificar un element" #: src/Gui/ItemSearch.cs:382 msgid "Show in Main Window" msgstr "" #: src/Gui/MainWindow.cs:77 src/Gui/MainWindow.cs:93 src/Gui/MainWindow.cs:635 #, csharp-format msgid "Database '{0}' not found." msgstr "Banca de donadas '{0}' introbabla." #: src/Gui/MainWindow.cs:185 msgid "Database not found" msgstr "Banca de donadas pas trobada" #: src/Gui/MainWindow.cs:186 msgid "Default database not found. Create?" msgstr "Banca de donadas per defaut pas trobada. Crear una novèla ?" #: src/Gui/MainWindow.cs:215 msgid "Unsupported database version" msgstr "Version de banca de donadas pas suportada" #: src/Gui/MainWindow.cs:216 msgid "This database version is not supported." msgstr "" #: src/Gui/MainWindow.cs:235 #, csharp-format msgid "{0} volumes loaded." msgstr "{0} mèdias cargats." #: src/Gui/MainWindow.cs:256 #, csharp-format msgid "An error occured while loading the volume list: {0}" msgstr "" #: src/Gui/MainWindow.cs:300 msgid "Please enter the name for the new database" msgstr "" #: src/Gui/MainWindow.cs:312 msgid "Database exists" msgstr "La banca de donadas existís ja" #: src/Gui/MainWindow.cs:313 msgid "Database already exists. Overwrite?" msgstr "" #: src/Gui/MainWindow.cs:326 msgid "Please select a database" msgstr "" #: src/Gui/MainWindow.cs:335 src/Gui/Import.cs:83 msgid "Database not found." msgstr "Banca de donadas introbabla." #: src/Gui/MainWindow.cs:356 #, csharp-format msgid "" "An error occured while accessing drive {0}:\n" "{1}" msgstr "" #: src/Gui/MainWindow.cs:378 #, csharp-format msgid "Drive {0} is not ready." msgstr "Lo lector {0} es pas prèst." #: src/Gui/MainWindow.cs:387 #, csharp-format msgid "Drive {0} is neither mounted nor does it contain an audio cd." msgstr "" #: src/Gui/MainWindow.cs:406 msgid "Confirmation" msgstr "Confirmacion" #: src/Gui/MainWindow.cs:407 msgid "Are you sure you really want to remove the selected volume?" msgstr "" #: src/Gui/MainWindow.cs:712 #, csharp-format msgid "Please insert volume '{0}'." msgstr "" #: src/Gui/MainWindow.cs:714 msgid "Waiting for volume" msgstr "" #: src/Gui/MainWindow.cs:966 msgid "Add Volume" msgstr "" #: src/Gui/MainWindow.cs:970 msgid "Search" msgstr "" #: src/Gui/MainWindow.cs:973 msgid "App Menu" msgstr "" #: src/Gui/MainWindow.cs:979 msgid "_New Database" msgstr "BDD _novèla" #: src/Gui/MainWindow.cs:982 msgid "_Open Database" msgstr "D_obrir BDD" #: src/Gui/MainWindow.cs:985 msgid "Open Default Database" msgstr "Dobrir la BDD per defaut" #: src/Gui/MainWindow.cs:991 msgid "Recent Databases" msgstr "" #: src/Gui/MainWindow.cs:998 msgid "_Import" msgstr "_Importar" #: src/Gui/MainWindow.cs:1001 msgid "_Preferences" msgstr "_Preferéncias" #: src/Gui/MainWindow.cs:1004 msgid "_Database Properties" msgstr "_Proprietats BDD" #: src/Gui/MainWindow.cs:1007 msgid "Info" msgstr "" #: src/Gui/MainWindow.cs:1010 msgid "_Quit" msgstr "_Quitar" #: src/Gui/MainWindow.cs:1016 msgid "_Edit Volume" msgstr "_Editar un Mèdia" #: src/Gui/MainWindow.cs:1019 msgid "_Remove Volume" msgstr "_Suprimir un Mèdia" #: src/Gui/MainWindow.cs:1022 msgid "Rescan Volume" msgstr "" #: src/Gui/MainWindow.cs:1034 msgid "Sort by" msgstr "Triar per" #: src/Gui/MainWindow.cs:1037 msgid "Descending" msgstr "Òrdre descreissent" #: src/Gui/MainWindow.cs:1043 msgid "Date added" msgstr "Apondut lo" #: src/Gui/MainWindow.cs:1044 msgid "Title" msgstr "Títol" #: src/Gui/MainWindow.cs:1045 msgid "Drivetype" msgstr "" #: src/Gui/MainWindow.cs:1142 msgid "Filter volumes" msgstr "Filtrar los mèdias" #: src/Gui/Import.cs:29 msgid "Import" msgstr "Importar" #: src/Gui/Import.cs:30 msgid "Abort" msgstr "Abandonar" #: src/Gui/Import.cs:31 msgid "Please select a database." msgstr "" #: src/Gui/Import.cs:72 #, csharp-format msgid "{0:0}% completed." msgstr "{0:0}% realizat." #: src/Gui/Import.cs:82 msgid "Import failed" msgstr "L'importacion a pas capitat" #: src/Gui/Import.cs:85 msgid "Import failed!" msgstr "Error d'importacion !" #: src/Gui/Import.cs:87 msgid "Import aborted." msgstr "Importacion abandonada." #: src/Gui/Import.cs:89 msgid "Import completed successfully." msgstr "Impòrt acabat amb succès." #: src/Gui/Import.cs:121 msgid "Import in progress" msgstr "Importacion en cors" #: src/Gui/Import.cs:122 msgid "You must stop the import before closing this window." msgstr "" #: src/Gui/Import.cs:148 msgid "Unknown format." msgstr "" #: src/Gui/Import.cs:175 msgid "Import Database" msgstr "Impòrt de la banca de donadas" #: src/Gui/Import.cs:186 msgid "Please select a database to import" msgstr "Seleccionatz una banca de donadas d'importar" #: src/Gui/Import.cs:194 msgid "All supported formats" msgstr "" #: src/Gui/Import.cs:198 #, csharp-format msgid ".{0} files" msgstr "" #: src/Gui/Import.cs:209 msgid "Database:" msgstr "Banca de donadas :" #: src/Gui/Import.cs:210 msgid "Format:" msgstr "Format :" #: src/Gui/ItemProperties.cs:29 msgid "Item Properties" msgstr "Propietats de l'element" #: src/Gui/VolumeScanner.cs:116 msgid "Scanning started." msgstr "Analisi aviada." #: src/Gui/VolumeScanner.cs:118 #, csharp-format msgid "Scanning of drive '{0}' started." msgstr "Aviada de l'analisi del lector '{0}'." #: src/Gui/VolumeScanner.cs:124 #, csharp-format msgid "" "Options: generate thumbs: {0}, extract metadata: {1}, discard symlinks: {2}, " "hashing: {3}." msgstr "" #: src/Gui/VolumeScanner.cs:131 #, csharp-format msgid "Options: MusicBrainz enabled: {0}" msgstr "Opcions : MusicBrainz activada : {0}" #: src/Gui/VolumeScanner.cs:157 msgid "Time" msgstr "Ora" #: src/Gui/VolumeScanner.cs:161 msgid "Message" msgstr "Messatge" #: src/Gui/VolumeScanner.cs:258 msgid "Stopping Scanner and performing rollback..." msgstr "Arrèst de l'analisi e anullacion dels cambiaments..." #: src/Gui/VolumeScanner.cs:268 msgid "yes" msgstr "òc" #: src/Gui/VolumeScanner.cs:268 msgid "no" msgstr "non" #: src/Gui/VolumeScanner.cs:291 msgid "Scan in progress" msgstr "Analisi en cors" #: src/Gui/VolumeScanner.cs:291 msgid "You must stop scanning before closing this window." msgstr "" #: src/Gui/VolumeScanner.cs:346 #, csharp-format msgid "An unhandled exception occured ({0})." msgstr "" #: src/Gui/VolumeScanner.cs:347 msgid "All database changes have been rolled back." msgstr "" #: src/Gui/VolumeScanner.cs:354 #, csharp-format msgid "Scanning failed. Reason: an unhandled exception occured ({0})." msgstr "" #: src/Gui/VolumeScanner.cs:356 msgid "Scanning aborted." msgstr "Analisi interrompuda." #: src/Gui/VolumeScanner.cs:358 msgid "Scanning completed successfully." msgstr "Analisi acabada amb succès." #: src/Gui/VolumeScanner.cs:488 msgid "VolumeScanner" msgstr "VolumeScanner" #: src/Gui/VolumeScanner.cs:500 msgid "Volume Information:" msgstr "Information sul mèdia :" #: src/Gui/VolumeScanner.cs:510 msgid "Scanner Log:" msgstr "Resultat de l'analisi :" #: src/Gui/VolumeScanner.cs:527 msgid "Database access" msgstr "Accès a la banca de donadas" #: src/Gui/Preferences.cs:119 msgid "None" msgstr "Pas cap" #: src/Gui/Preferences.cs:228 msgid "Unsupported theme" msgstr "" #: src/Gui/Preferences.cs:229 msgid "The selected icon theme is currently not supported on your system." msgstr "" #: src/Gui/Preferences.cs:267 msgid "Restart required" msgstr "Vos cal tornar amodar l'ordenador" #: src/Gui/Preferences.cs:268 #, csharp-format msgid "You must restart {0} for icontheme changes to take effect." msgstr "Vos cal reamodar {0} per aplicar lo cambiament del tèma." #: src/Gui/Preferences.cs:298 msgid "Preferences" msgstr "Preferéncias" #: src/Gui/Preferences.cs:322 msgid "_Load Defaults" msgstr "_Cargar defauts" #: src/Gui/Preferences.cs:349 msgid "Icon theme:" msgstr "Tèma d'icònas :" #: src/Gui/Preferences.cs:355 msgid "Reopen most recent database on startup" msgstr "" #: src/Gui/Preferences.cs:359 msgid "Show iteminfo panel" msgstr "" #: src/Gui/Preferences.cs:363 msgid "Show hidden files" msgstr "Afichar los fichièrs amagats" #: src/Gui/Preferences.cs:367 msgid "Show thumbnails in the filebrowser" msgstr "" #: src/Gui/Preferences.cs:370 msgid "General" msgstr "General" #: src/Gui/Preferences.cs:378 msgid "Don't prompt, always scan:" msgstr "" #: src/Gui/Preferences.cs:397 msgid "Generate Thumbnails" msgstr "Generacion de las miniaturas" #: src/Gui/Preferences.cs:401 msgid "Extract metadata" msgstr "Extraccion de las metadonadas" #: src/Gui/Preferences.cs:405 msgid "Discard symbolic links" msgstr "Ignorar los ligams simbolics" #: src/Gui/Preferences.cs:409 msgid "Compute hashcodes for files (slow!)" msgstr "" #: src/Gui/Preferences.cs:413 msgid "Fetch audio cd metadata from MusicBrainz.org" msgstr "" #: src/Gui/Preferences.cs:416 msgid "Scanner" msgstr "Scanner" Basenji/po/de.po0000664000175000017500000005317012067326706013674 0ustar patrickpatrick# German translation for basenji # Copyright (c) 2008 Rosetta Contributors and Canonical Ltd 2008 # This file is distributed under the same license as the basenji package. # FIRST AUTHOR , 2008. # msgid "" msgstr "" "Project-Id-Version: basenji\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2012-07-15 15:49+0200\n" "PO-Revision-Date: 2012-07-15 14:13+0000\n" "Last-Translator: Patrick Ulbrich \n" "Language-Team: German \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2012-10-27 11:00+0000\n" "X-Generator: Launchpad (build 16194)\n" #: src/Util.cs:30 #, csharp-format msgid "{0} Bytes" msgstr "{0} Bytes" #: src/Util.cs:32 msgid "Bytes" msgstr "Bytes" #: src/Util.cs:32 msgid "KB" msgstr "KB" #: src/Util.cs:32 msgid "MB" msgstr "MB" #: src/Util.cs:32 msgid "GB" msgstr "GB" #: src/Util.cs:32 msgid "TB" msgstr "TB" #: src/Options.cs:477 msgid "OptionName" msgstr "OptionsName" #: src/FileDialog.cs:51 msgid "VolumeDatabase files" msgstr "VolumeDatabase Dateien" #: src/FileDialog.cs:56 msgid "All files" msgstr "Alle Dateien" #: src/Main.cs:142 src/Gui/MainWindow.cs:76 src/Gui/MainWindow.cs:92 #: src/Gui/MainWindow.cs:334 src/Gui/MainWindow.cs:355 #: src/Gui/MainWindow.cs:377 src/Gui/MainWindow.cs:386 #: src/Gui/MainWindow.cs:635 msgid "Error" msgstr "Fehler" #: src/Main.cs:142 #, csharp-format msgid "{0} is already running." msgstr "{0} läuft bereits." #: src/Gui/Widgets/VolumeView.cs:42 src/Gui/Widgets/SearchResultView.cs:30 msgid "Unnamed" msgstr "Unbenannt" #: src/Gui/Widgets/VolumeView.cs:43 #: src/Gui/Widgets/Editors/VolumeEditor.cs:259 msgid "Category:" msgstr "Kategorie:" #: src/Gui/Widgets/VolumeView.cs:44 msgid "files" msgstr "Dateien" #: src/Gui/Widgets/VolumeView.cs:45 msgid "tracks" msgstr "Tracks" #: src/Gui/Widgets/ItemView.cs:29 msgid "Loading..." msgstr "Ladevorgang…" #: src/Gui/Widgets/ItemView.cs:30 msgid "(empty)" msgstr "(leer)" #: src/Gui/Widgets/ItemView.cs:99 src/Gui/DriveSelection.cs:80 msgid "Unknown" msgstr "Unbekannt" #: src/Gui/Widgets/ItemView.cs:170 src/Gui/Widgets/Editors/ItemEditor.cs:96 msgid "Name" msgstr "Name" #: src/Gui/Widgets/ItemView.cs:176 msgid "Artist" msgstr "Interpret" #: src/Gui/Widgets/ItemView.cs:181 #: src/Gui/Widgets/Editors/AudioTrackItemEditor.cs:53 #: src/Gui/Widgets/ItemInfo.cs:225 src/Gui/Widgets/ItemInfo.cs:288 msgid "Duration" msgstr "Länge" #: src/Gui/Widgets/Editors/FileSystemVolumeEditor.cs:34 #: src/Gui/DriveSelection.cs:168 msgid "Filesystem" msgstr "Dateisystem" #: src/Gui/Widgets/Editors/FileSystemVolumeEditor.cs:65 msgid "Files:" msgstr "Dateien:" #: src/Gui/Widgets/Editors/FileSystemVolumeEditor.cs:66 msgid "Directories:" msgstr "Verzeichnisse:" #: src/Gui/Widgets/Editors/FileSystemVolumeEditor.cs:67 msgid "Total size:" msgstr "Gesamtgröße:" #: src/Gui/Widgets/Editors/ItemEditor.cs:95 msgid "Item type" msgstr "Element-Typ" #: src/Gui/Widgets/Editors/ItemEditor.cs:111 src/Gui/Widgets/ItemInfo.cs:371 msgid "Note" msgstr "Notiz" #: src/Gui/Widgets/Editors/ItemEditor.cs:112 src/Gui/Widgets/ItemInfo.cs:374 msgid "Keywords" msgstr "Schlüsselwörter" #: src/Gui/Widgets/Editors/AudioTrackItemEditor.cs:31 #: src/Gui/Widgets/SearchResultView.cs:34 msgid "Audio CD track" msgstr "Audio-CD Track" #: src/Gui/Widgets/Editors/AudioTrackItemEditor.cs:54 #: src/Gui/Widgets/ItemInfo.cs:230 msgid "Type" msgstr "Typ" #: src/Gui/Widgets/Editors/DirectoryItemEditor.cs:28 msgid "Directory" msgstr "Verzeichnis" #: src/Gui/Widgets/Editors/FileSystemItemEditor.cs:59 #: src/Gui/Widgets/SearchResultView.cs:31 src/Gui/Widgets/ItemInfo.cs:183 msgid "Location" msgstr "Ort" #: src/Gui/Widgets/Editors/FileSystemItemEditor.cs:60 #: src/Gui/Widgets/ItemInfo.cs:185 msgid "Last write time" msgstr "Geändert" #: src/Gui/Widgets/Editors/FileSystemItemEditor.cs:61 #: src/Gui/Widgets/ItemInfo.cs:210 msgid "Filetype" msgstr "Dateityp" #: src/Gui/Widgets/Editors/FileItemEditor.cs:31 msgid "File" msgstr "Datei" #: src/Gui/Widgets/Editors/FileItemEditor.cs:52 #: src/Gui/Widgets/ItemInfo.cs:204 src/Gui/Widgets/ItemInfo.cs:226 #: src/Gui/DriveSelection.cs:148 msgid "Size" msgstr "Größe" #: src/Gui/Widgets/Editors/FileItemEditor.cs:53 #: src/Gui/Widgets/ItemInfo.cs:206 msgid "Hash" msgstr "Hash" #: src/Gui/Widgets/Editors/AudioCdVolumeEditor.cs:33 msgid "Audio CD" msgstr "Audio-CD" #: src/Gui/Widgets/Editors/AudioCdVolumeEditor.cs:63 msgid "Tracks:" msgstr "Tracks:" #: src/Gui/Widgets/Editors/AudioCdVolumeEditor.cs:64 msgid "Duration:" msgstr "Länge:" #: src/Gui/Widgets/Editors/VolumeEditor.cs:45 msgid "Backup" msgstr "Backup" #: src/Gui/Widgets/Editors/VolumeEditor.cs:46 #: src/Gui/Widgets/CategoryView.cs:60 msgid "Documents" msgstr "Dokumente" #: src/Gui/Widgets/Editors/VolumeEditor.cs:47 #: src/Gui/Widgets/CategoryView.cs:61 msgid "Music" msgstr "Musik" #: src/Gui/Widgets/Editors/VolumeEditor.cs:48 msgid "Audiobooks" msgstr "Hörbücher" #: src/Gui/Widgets/Editors/VolumeEditor.cs:49 #: src/Gui/Widgets/CategoryView.cs:62 msgid "Movies" msgstr "Filme" #: src/Gui/Widgets/Editors/VolumeEditor.cs:50 msgid "Videos" msgstr "Videos" #: src/Gui/Widgets/Editors/VolumeEditor.cs:51 msgid "Pictures" msgstr "Fotos" #: src/Gui/Widgets/Editors/VolumeEditor.cs:52 msgid "Games" msgstr "Spiele" #: src/Gui/Widgets/Editors/VolumeEditor.cs:53 src/Gui/Widgets/ItemInfo.cs:319 msgid "Software" msgstr "Software" #: src/Gui/Widgets/Editors/VolumeEditor.cs:54 msgid "Misc" msgstr "Verschiedenes" #: src/Gui/Widgets/Editors/VolumeEditor.cs:55 msgid "Other" msgstr "Sonstiges" #: src/Gui/Widgets/Editors/VolumeEditor.cs:225 msgid "Yes" msgstr "Ja" #: src/Gui/Widgets/Editors/VolumeEditor.cs:225 msgid "No" msgstr "Nein" #: src/Gui/Widgets/Editors/VolumeEditor.cs:235 msgid "Volume type:" msgstr "Datenträgertyp:" #: src/Gui/Widgets/Editors/VolumeEditor.cs:236 msgid "Hashed:" msgstr "Gehasht:" #: src/Gui/Widgets/Editors/VolumeEditor.cs:237 msgid "Added:" msgstr "Hinzugefügt:" #: src/Gui/Widgets/Editors/VolumeEditor.cs:258 msgid "Archive No.:" msgstr "Archiv-Nr.:" #: src/Gui/Widgets/Editors/VolumeEditor.cs:260 msgid "Title:" msgstr "Titel:" #: src/Gui/Widgets/Editors/VolumeEditor.cs:261 src/Gui/DBProperties.cs:98 msgid "Description:" msgstr "Beschreibung:" #: src/Gui/Widgets/Editors/VolumeEditor.cs:262 msgid "Keywords:" msgstr "Stichwörter:" #: src/Gui/Widgets/Editors/VolumeEditor.cs:263 msgid "Loaned to:" msgstr "Verliehen an:" #: src/Gui/Widgets/Editors/VolumeEditor.cs:264 msgid "Loaned date:" msgstr "Verleihdatum:" #: src/Gui/Widgets/Editors/VolumeEditor.cs:265 msgid "Return date:" msgstr "Rückgabedatum:" #: src/Gui/Widgets/CategoryView.cs:58 msgid "Directories" msgstr "Verzeichnisse" #: src/Gui/Widgets/CategoryView.cs:59 msgid "Text" msgstr "Text" #: src/Gui/Widgets/CategoryView.cs:63 msgid "Images" msgstr "Bilder" #: src/Gui/Widgets/CategoryView.cs:64 msgid "Applications" msgstr "Programme" #: src/Gui/Widgets/CategoryView.cs:65 msgid "Archives" msgstr "Archive" #: src/Gui/Widgets/CategoryView.cs:66 msgid "Development" msgstr "Entwicklung" #: src/Gui/Widgets/CategoryView.cs:96 src/Gui/MainWindow.cs:1046 msgid "Category" msgstr "Kategorie" #: src/Gui/Widgets/CategoryView.cs:128 msgid "All items" msgstr "Alle Elemente" #: src/Gui/Widgets/SearchResultView.cs:32 msgid "Volume" msgstr "Datenträger" #: src/Gui/Widgets/SearchResultView.cs:33 src/Gui/MainWindow.cs:1040 msgid "Archive No." msgstr "Archiv-Nr." #: src/Gui/Widgets/ItemInfo.cs:40 msgid "by" msgstr "von" #: src/Gui/Widgets/ItemInfo.cs:41 msgid "from" msgstr "aus" #: src/Gui/Widgets/ItemInfo.cs:196 msgid "Symlink target" msgstr "SymLink-Ziel" #: src/Gui/Widgets/ItemInfo.cs:227 msgid "Track No." msgstr "Track-Nr." #: src/Gui/Widgets/ItemInfo.cs:258 msgid "Genre" msgstr "Genre" #: src/Gui/Widgets/ItemInfo.cs:278 msgid "Year" msgstr "Jahr" #: src/Gui/Widgets/ItemInfo.cs:283 msgid "Description" msgstr "Beschreibung" #: src/Gui/Widgets/ItemInfo.cs:294 msgid "Dimensions" msgstr "Abmessungen" #: src/Gui/Widgets/ItemInfo.cs:299 msgid "Format" msgstr "Format" #: src/Gui/Widgets/ItemInfo.cs:303 msgid "Author" msgstr "Autor" #: src/Gui/Widgets/ItemInfo.cs:307 msgid "Copyright" msgstr "Urheberrecht" #: src/Gui/Widgets/ItemInfo.cs:311 msgid "Producer" msgstr "Hersteller" #: src/Gui/Widgets/ItemInfo.cs:315 msgid "Creator" msgstr "Erzeuger" #: src/Gui/Widgets/ItemInfo.cs:323 msgid "Language" msgstr "Sprache" #: src/Gui/Widgets/ItemInfo.cs:327 msgid "Page count" msgstr "Anzahl Seiten" #: src/Gui/Widgets/ItemInfo.cs:346 msgid "File count" msgstr "Anzahl Dateien" #: src/Gui/Widgets/PageNavigation.cs:27 msgid "No items." msgstr "Keine Elemente." #: src/Gui/Widgets/PageNavigation.cs:145 #, csharp-format msgid "Page {0}/{1} ({2} - {3} of {4} items)" msgstr "Seite {0}/{1} ({2} - {3} von {4} Elementen)" #: src/Gui/ObjectProperties.cs:54 src/Gui/VolumeScanner.cs:248 msgid "Invalid data" msgstr "Ungültige Daten" #: src/Gui/ObjectProperties.cs:54 src/Gui/VolumeScanner.cs:249 #, csharp-format msgid "" "\"{0}\" is {1}.\n" "\n" "Expected format: {2}\n" "Please correct or remove the data you entered." msgstr "" "\"{0}\" ist {1}.\n" "\n" "Erwartetes Format: {2}\n" "Bitte korrigieren oder entfernen Sie Ihre Eingaben." #: src/Gui/DBProperties.cs:85 msgid "Database Properties" msgstr "Datenbank-Eigenschaften" #: src/Gui/DBProperties.cs:97 msgid "Name:" msgstr "Name:" #: src/Gui/DBProperties.cs:99 msgid "Created:" msgstr "Erstellt am:" #: src/Gui/VolumeProperties.cs:29 msgid "Volume Properties" msgstr "Datenträger-Eigenschaften" #: src/Gui/DriveSelection.cs:60 msgid "Waiting for drives..." msgstr "Warte auf Laufwerke..." #: src/Gui/DriveSelection.cs:133 msgid "Drive" msgstr "Laufwerk" #: src/Gui/DriveSelection.cs:139 msgid "Label" msgstr "Bezeichnung" #: src/Gui/DriveSelection.cs:241 msgid "Please select a drive to scan" msgstr "Bitte wählen Sie ein Lauwerk zum Scannen" #: src/Gui/About.cs:28 msgid "A cross-platform media indexing/search tool." msgstr "Ein plattformübergreifendes Datenträger Indizierungs-/Suchwerkzeug." #: src/Gui/About.cs:29 #, csharp-format msgid "Using VolumeDB v{0}." msgstr "Verwende VolumeDB v{0}." #: src/Gui/About.cs:31 msgid "Copyright (c) " msgstr "Copyright (c) " #: src/Gui/ItemSearch.cs:81 #, csharp-format msgid "Found {0} items in {1:F3} seconds." msgstr "{0} Elemente in {1:F3} Sekunden gefunden." #: src/Gui/ItemSearch.cs:92 src/Gui/MainWindow.cs:519 msgid "Timeout: another search is probably still in progress." msgstr "Zeitüberschreitung: Vermutlich läuft noch ein weiterer Suchvorgang." #: src/Gui/ItemSearch.cs:94 msgid "Too many search results. Please refine your search criteria." msgstr "Zu viele Suchergebnisse. Bitte verfeinern Sie Ihre Suchkriterien." #: src/Gui/ItemSearch.cs:112 src/Gui/MainWindow.cs:535 msgid "Searching..." msgstr "Suche..." #: src/Gui/ItemSearch.cs:267 msgid "Search Items" msgstr "Elemente suchen" #: src/Gui/ItemSearch.cs:279 src/Gui/MainWindow.cs:1145 msgid "default" msgstr "standard" #: src/Gui/ItemSearch.cs:283 msgid "Search items" msgstr "Elemente suchen" #: src/Gui/ItemSearch.cs:318 msgid "Quick tip:" msgstr "Heißer Tipp:" #: src/Gui/ItemSearch.cs:319 #, csharp-format msgid "" "Click on the icon to the left of the search field to build advanced search " "queries.\n" "Example: {0}" msgstr "" "Klicken Sie auf das Icon links vom Suchfeld um erweiterte Suchanfragen zu " "erstellen.\n" "Beispiel: {0}" #: src/Gui/ItemSearch.cs:326 msgid "No search results." msgstr "Keine Suchergebnisse." #: src/Gui/ItemSearch.cs:375 src/Gui/MainWindow.cs:1028 msgid "Edit Item" msgstr "Element bearbeiten" #: src/Gui/ItemSearch.cs:382 msgid "Show in Main Window" msgstr "Im Hauptfenster anzeigen" #: src/Gui/MainWindow.cs:77 src/Gui/MainWindow.cs:93 src/Gui/MainWindow.cs:635 #, csharp-format msgid "Database '{0}' not found." msgstr "Datenbank '{0}' wurde nicht gefunden." #: src/Gui/MainWindow.cs:185 msgid "Database not found" msgstr "Datenbank wurde nicht gefunden" #: src/Gui/MainWindow.cs:186 msgid "Default database not found. Create?" msgstr "Die Standard-Datenbank konnte nicht gefunden werden. Erstellen?" #: src/Gui/MainWindow.cs:215 msgid "Unsupported database version" msgstr "Nicht unterstützte Datenbankversion" #: src/Gui/MainWindow.cs:216 msgid "This database version is not supported." msgstr "Diese Datenbankversion wird nicht untersützt." #: src/Gui/MainWindow.cs:235 #, csharp-format msgid "{0} volumes loaded." msgstr "{0} Datenträger geladen." #: src/Gui/MainWindow.cs:256 #, csharp-format msgid "An error occured while loading the volume list: {0}" msgstr "" "Ein Fehler ist während des Ladens der Datenträger-Liste aufgetreten: {0}" #: src/Gui/MainWindow.cs:300 msgid "Please enter the name for the new database" msgstr "Bitte geben Sie den Namen der neuen Datenbank ein" #: src/Gui/MainWindow.cs:312 msgid "Database exists" msgstr "Datenbank existiert bereits" #: src/Gui/MainWindow.cs:313 msgid "Database already exists. Overwrite?" msgstr "Die Datenbank existiert bereits. Überschreiben?" #: src/Gui/MainWindow.cs:326 msgid "Please select a database" msgstr "Bitte wählen Sie eine Datenbank" #: src/Gui/MainWindow.cs:335 src/Gui/Import.cs:83 msgid "Database not found." msgstr "Die Datenbank wurde nicht gefunden." #: src/Gui/MainWindow.cs:356 #, csharp-format msgid "" "An error occured while accessing drive {0}:\n" "{1}" msgstr "" "Ein Fehler trat beim Zugriff auf das Laufwerk {0} auf:\n" "{1}" #: src/Gui/MainWindow.cs:378 #, csharp-format msgid "Drive {0} is not ready." msgstr "Das Laufwerk {0} ist nicht bereit." #: src/Gui/MainWindow.cs:387 #, csharp-format msgid "Drive {0} is neither mounted nor does it contain an audio cd." msgstr "Laufwerk {0} ist weder eingehängt noch enthält es eine Audio-CD." #: src/Gui/MainWindow.cs:406 msgid "Confirmation" msgstr "Bestätigung" #: src/Gui/MainWindow.cs:407 msgid "Are you sure you really want to remove the selected volume?" msgstr "" "Sind Sie wirklich sicher, dass sie den gewählten Datenträger entfernen " "möchten?" #: src/Gui/MainWindow.cs:712 #, csharp-format msgid "Please insert volume '{0}'." msgstr "Bitte legen Sie den Datenträger '{0}' ein." #: src/Gui/MainWindow.cs:714 msgid "Waiting for volume" msgstr "Warte auf Datenträger" #: src/Gui/MainWindow.cs:966 msgid "Add Volume" msgstr "Datenträger hinzufügen" #: src/Gui/MainWindow.cs:970 msgid "Search" msgstr "Suchen" #: src/Gui/MainWindow.cs:973 msgid "App Menu" msgstr "App-Menü" #: src/Gui/MainWindow.cs:979 msgid "_New Database" msgstr "_Neue Datenbank" #: src/Gui/MainWindow.cs:982 msgid "_Open Database" msgstr "Datenbank öffnen" #: src/Gui/MainWindow.cs:985 msgid "Open Default Database" msgstr "Standard-Datenbank öffnen" #: src/Gui/MainWindow.cs:991 msgid "Recent Databases" msgstr "Letzte Datenbanken" #: src/Gui/MainWindow.cs:998 msgid "_Import" msgstr "_Importieren" #: src/Gui/MainWindow.cs:1001 msgid "_Preferences" msgstr "Einstellungen" #: src/Gui/MainWindow.cs:1004 msgid "_Database Properties" msgstr "Datenbank-Eigenschaften" #: src/Gui/MainWindow.cs:1007 msgid "Info" msgstr "Über" #: src/Gui/MainWindow.cs:1010 msgid "_Quit" msgstr "Beenden" #: src/Gui/MainWindow.cs:1016 msgid "_Edit Volume" msgstr "Datenträger bearbeiten" #: src/Gui/MainWindow.cs:1019 msgid "_Remove Volume" msgstr "Datenträger entfe_rnen" #: src/Gui/MainWindow.cs:1022 msgid "Rescan Volume" msgstr "Datenträger neu einlesen" #: src/Gui/MainWindow.cs:1034 msgid "Sort by" msgstr "Sortieren nach" #: src/Gui/MainWindow.cs:1037 msgid "Descending" msgstr "Absteigend" #: src/Gui/MainWindow.cs:1043 msgid "Date added" msgstr "Hinzufüge-Datum" #: src/Gui/MainWindow.cs:1044 msgid "Title" msgstr "Titel" #: src/Gui/MainWindow.cs:1045 msgid "Drivetype" msgstr "Laufwerktyp" #: src/Gui/MainWindow.cs:1142 msgid "Filter volumes" msgstr "Datenträger filtern" #: src/Gui/Import.cs:29 msgid "Import" msgstr "Importieren" #: src/Gui/Import.cs:30 msgid "Abort" msgstr "Abbrechen" #: src/Gui/Import.cs:31 msgid "Please select a database." msgstr "Bitte wählen Sie eine Datenbank." #: src/Gui/Import.cs:72 #, csharp-format msgid "{0:0}% completed." msgstr "{0:0}% abgeschlossen." #: src/Gui/Import.cs:82 msgid "Import failed" msgstr "Importieren fehlgeschlagen" #: src/Gui/Import.cs:85 msgid "Import failed!" msgstr "Importieren fehlgeschlagen!" #: src/Gui/Import.cs:87 msgid "Import aborted." msgstr "Importieren abgebrochen." #: src/Gui/Import.cs:89 msgid "Import completed successfully." msgstr "Importieren erfolgreich abgeschlossen." #: src/Gui/Import.cs:121 msgid "Import in progress" msgstr "Importvorgang läuft" #: src/Gui/Import.cs:122 msgid "You must stop the import before closing this window." msgstr "" "Sie müssen den Importier-Vorgang abbrechen, bevor Sie dieses Fenster " "schließen können." #: src/Gui/Import.cs:148 msgid "Unknown format." msgstr "Unbekanntes Format." #: src/Gui/Import.cs:175 msgid "Import Database" msgstr "Datenbank importieren" #: src/Gui/Import.cs:186 msgid "Please select a database to import" msgstr "Bitte wählen Sie eine Datenbank zum Importieren aus" #: src/Gui/Import.cs:194 msgid "All supported formats" msgstr "Alle unterstützten Formate" #: src/Gui/Import.cs:198 #, csharp-format msgid ".{0} files" msgstr ".{0} Dateien" #: src/Gui/Import.cs:209 msgid "Database:" msgstr "Datenbank:" #: src/Gui/Import.cs:210 msgid "Format:" msgstr "Format:" #: src/Gui/ItemProperties.cs:29 msgid "Item Properties" msgstr "Element-Eigenschaften" #: src/Gui/VolumeScanner.cs:116 msgid "Scanning started." msgstr "Scanvorgang gestartet." #: src/Gui/VolumeScanner.cs:118 #, csharp-format msgid "Scanning of drive '{0}' started." msgstr "Scanvorgang für Laufwerk '{0}' gestartet." #: src/Gui/VolumeScanner.cs:124 #, csharp-format msgid "" "Options: generate thumbs: {0}, extract metadata: {1}, discard symlinks: {2}, " "hashing: {3}." msgstr "" "Optionen: Thumbnails generieren: {0}, Metadaten extrahieren: {1}, " "symbolische Links verwerfen: {2}, Hashcodes berechnen: {3}." #: src/Gui/VolumeScanner.cs:131 #, csharp-format msgid "Options: MusicBrainz enabled: {0}" msgstr "Optionen: MusicBrainz aktiv: {0}" #: src/Gui/VolumeScanner.cs:157 msgid "Time" msgstr "Zeit" #: src/Gui/VolumeScanner.cs:161 msgid "Message" msgstr "Meldung" #: src/Gui/VolumeScanner.cs:258 msgid "Stopping Scanner and performing rollback..." msgstr "Stoppe Scanner und führe Rollback durch..." #: src/Gui/VolumeScanner.cs:268 msgid "yes" msgstr "ja" #: src/Gui/VolumeScanner.cs:268 msgid "no" msgstr "nein" #: src/Gui/VolumeScanner.cs:291 msgid "Scan in progress" msgstr "Aktiver Scanvorgang" #: src/Gui/VolumeScanner.cs:291 msgid "You must stop scanning before closing this window." msgstr "" "Sie müssen den Scanvorgang abbrechen bevor Sie dieses Fenster schließen." #: src/Gui/VolumeScanner.cs:346 #, csharp-format msgid "An unhandled exception occured ({0})." msgstr "Ein unbehandelter Fehler ist aufgetreten ({0})." #: src/Gui/VolumeScanner.cs:347 msgid "All database changes have been rolled back." msgstr "Alle Datenbankänderungen wurden zurückgerollt." #: src/Gui/VolumeScanner.cs:354 #, csharp-format msgid "Scanning failed. Reason: an unhandled exception occured ({0})." msgstr "" "Scanvorgang fehlgeschlagen. Ursache: Ein unbehandelter Fehler ist " "aufgetreten ({0})." #: src/Gui/VolumeScanner.cs:356 msgid "Scanning aborted." msgstr "Scanvorgang abgebrochen." #: src/Gui/VolumeScanner.cs:358 msgid "Scanning completed successfully." msgstr "Scanvorgang erfolgreich beendet." #: src/Gui/VolumeScanner.cs:488 msgid "VolumeScanner" msgstr "VolumeScanner" #: src/Gui/VolumeScanner.cs:500 msgid "Volume Information:" msgstr "Datenträger Informationen:" #: src/Gui/VolumeScanner.cs:510 msgid "Scanner Log:" msgstr "Scanner Log:" #: src/Gui/VolumeScanner.cs:527 msgid "Database access" msgstr "Datenbankzugriff" #: src/Gui/Preferences.cs:119 msgid "None" msgstr "Keines" #: src/Gui/Preferences.cs:228 msgid "Unsupported theme" msgstr "Thema nicht unterstützt" #: src/Gui/Preferences.cs:229 msgid "The selected icon theme is currently not supported on your system." msgstr "" "Das gewählte Icon-Thema wird momentan nicht auf Ihrem System unterstützt." #: src/Gui/Preferences.cs:267 msgid "Restart required" msgstr "Neustart erforderlich" #: src/Gui/Preferences.cs:268 #, csharp-format msgid "You must restart {0} for icontheme changes to take effect." msgstr "" "Sie müssen {0} neustarten, damit die Änderungen des Iconthemas wirksam " "werden." #: src/Gui/Preferences.cs:298 msgid "Preferences" msgstr "Einstellungen" #: src/Gui/Preferences.cs:322 msgid "_Load Defaults" msgstr "Standardwerte _laden" #: src/Gui/Preferences.cs:349 msgid "Icon theme:" msgstr "Icon-Thema:" #: src/Gui/Preferences.cs:355 msgid "Reopen most recent database on startup" msgstr "Zuletzt geöffnete Datenbank beim Start laden" #: src/Gui/Preferences.cs:359 msgid "Show iteminfo panel" msgstr "ItemInfo-Leiste anzeigen" #: src/Gui/Preferences.cs:363 msgid "Show hidden files" msgstr "Versteckte Dateien anzeigen" #: src/Gui/Preferences.cs:367 msgid "Show thumbnails in the filebrowser" msgstr "Thumbnails im Dateibrowser anzeigen" #: src/Gui/Preferences.cs:370 msgid "General" msgstr "Allgemein" #: src/Gui/Preferences.cs:378 msgid "Don't prompt, always scan:" msgstr "Scanne immer ohne zu fragen:" #: src/Gui/Preferences.cs:397 msgid "Generate Thumbnails" msgstr "Thumbnails generieren" #: src/Gui/Preferences.cs:401 msgid "Extract metadata" msgstr "Metadaten extrahieren" #: src/Gui/Preferences.cs:405 msgid "Discard symbolic links" msgstr "Symbolische Links verwerfen" #: src/Gui/Preferences.cs:409 msgid "Compute hashcodes for files (slow!)" msgstr "Hashcodes für Dateien berechnen (langsam!)" #: src/Gui/Preferences.cs:413 msgid "Fetch audio cd metadata from MusicBrainz.org" msgstr "Audio-CD Metadaten von MusicBrainz.org abrufen" #: src/Gui/Preferences.cs:416 msgid "Scanner" msgstr "Scanner" Basenji/po/he.po0000664000175000017500000004746312067326706013710 0ustar patrickpatrick# Hebrew translation for basenji # Copyright (c) 2008 Rosetta Contributors and Canonical Ltd 2008 # This file is distributed under the same license as the basenji package. # FIRST AUTHOR , 2008. # msgid "" msgstr "" "Project-Id-Version: basenji\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2012-07-15 15:49+0200\n" "PO-Revision-Date: 2008-10-28 07:41+0000\n" "Last-Translator: Yaron \n" "Language-Team: Hebrew \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2012-10-27 11:00+0000\n" "X-Generator: Launchpad (build 16194)\n" #: src/Util.cs:30 #, csharp-format msgid "{0} Bytes" msgstr "{0} בתים" #: src/Util.cs:32 msgid "Bytes" msgstr "בתים" #: src/Util.cs:32 msgid "KB" msgstr "ק\"ב" #: src/Util.cs:32 msgid "MB" msgstr "מ\"ב" #: src/Util.cs:32 msgid "GB" msgstr "ג\"ב" #: src/Util.cs:32 msgid "TB" msgstr "ט\"ב" #: src/Options.cs:477 msgid "OptionName" msgstr "" #: src/FileDialog.cs:51 msgid "VolumeDatabase files" msgstr "קבצי VolumeDatabase" #: src/FileDialog.cs:56 msgid "All files" msgstr "כל הקבצים" #: src/Main.cs:142 src/Gui/MainWindow.cs:76 src/Gui/MainWindow.cs:92 #: src/Gui/MainWindow.cs:334 src/Gui/MainWindow.cs:355 #: src/Gui/MainWindow.cs:377 src/Gui/MainWindow.cs:386 #: src/Gui/MainWindow.cs:635 msgid "Error" msgstr "שגיאה" #: src/Main.cs:142 #, csharp-format msgid "{0} is already running." msgstr "{0} כבר פעיל." #: src/Gui/Widgets/VolumeView.cs:42 src/Gui/Widgets/SearchResultView.cs:30 msgid "Unnamed" msgstr "" #: src/Gui/Widgets/VolumeView.cs:43 #: src/Gui/Widgets/Editors/VolumeEditor.cs:259 msgid "Category:" msgstr "קטגוריה:" #: src/Gui/Widgets/VolumeView.cs:44 msgid "files" msgstr "" #: src/Gui/Widgets/VolumeView.cs:45 msgid "tracks" msgstr "" #: src/Gui/Widgets/ItemView.cs:29 msgid "Loading..." msgstr "טוען..." #: src/Gui/Widgets/ItemView.cs:30 msgid "(empty)" msgstr "(ריק)" #: src/Gui/Widgets/ItemView.cs:99 src/Gui/DriveSelection.cs:80 msgid "Unknown" msgstr "" #: src/Gui/Widgets/ItemView.cs:170 src/Gui/Widgets/Editors/ItemEditor.cs:96 msgid "Name" msgstr "" #: src/Gui/Widgets/ItemView.cs:176 msgid "Artist" msgstr "" #: src/Gui/Widgets/ItemView.cs:181 #: src/Gui/Widgets/Editors/AudioTrackItemEditor.cs:53 #: src/Gui/Widgets/ItemInfo.cs:225 src/Gui/Widgets/ItemInfo.cs:288 msgid "Duration" msgstr "" #: src/Gui/Widgets/Editors/FileSystemVolumeEditor.cs:34 #: src/Gui/DriveSelection.cs:168 msgid "Filesystem" msgstr "מערכת קבצים" #: src/Gui/Widgets/Editors/FileSystemVolumeEditor.cs:65 msgid "Files:" msgstr "קבצים:" #: src/Gui/Widgets/Editors/FileSystemVolumeEditor.cs:66 msgid "Directories:" msgstr "תיקיות:" #: src/Gui/Widgets/Editors/FileSystemVolumeEditor.cs:67 msgid "Total size:" msgstr "הגודל הכללי:" #: src/Gui/Widgets/Editors/ItemEditor.cs:95 msgid "Item type" msgstr "" #: src/Gui/Widgets/Editors/ItemEditor.cs:111 src/Gui/Widgets/ItemInfo.cs:371 msgid "Note" msgstr "" #: src/Gui/Widgets/Editors/ItemEditor.cs:112 src/Gui/Widgets/ItemInfo.cs:374 msgid "Keywords" msgstr "" #: src/Gui/Widgets/Editors/AudioTrackItemEditor.cs:31 #: src/Gui/Widgets/SearchResultView.cs:34 msgid "Audio CD track" msgstr "" #: src/Gui/Widgets/Editors/AudioTrackItemEditor.cs:54 #: src/Gui/Widgets/ItemInfo.cs:230 msgid "Type" msgstr "" #: src/Gui/Widgets/Editors/DirectoryItemEditor.cs:28 msgid "Directory" msgstr "" #: src/Gui/Widgets/Editors/FileSystemItemEditor.cs:59 #: src/Gui/Widgets/SearchResultView.cs:31 src/Gui/Widgets/ItemInfo.cs:183 msgid "Location" msgstr "" #: src/Gui/Widgets/Editors/FileSystemItemEditor.cs:60 #: src/Gui/Widgets/ItemInfo.cs:185 msgid "Last write time" msgstr "" #: src/Gui/Widgets/Editors/FileSystemItemEditor.cs:61 #: src/Gui/Widgets/ItemInfo.cs:210 msgid "Filetype" msgstr "" #: src/Gui/Widgets/Editors/FileItemEditor.cs:31 msgid "File" msgstr "" #: src/Gui/Widgets/Editors/FileItemEditor.cs:52 #: src/Gui/Widgets/ItemInfo.cs:204 src/Gui/Widgets/ItemInfo.cs:226 #: src/Gui/DriveSelection.cs:148 msgid "Size" msgstr "נפח" #: src/Gui/Widgets/Editors/FileItemEditor.cs:53 #: src/Gui/Widgets/ItemInfo.cs:206 msgid "Hash" msgstr "" #: src/Gui/Widgets/Editors/AudioCdVolumeEditor.cs:33 msgid "Audio CD" msgstr "" #: src/Gui/Widgets/Editors/AudioCdVolumeEditor.cs:63 msgid "Tracks:" msgstr "" #: src/Gui/Widgets/Editors/AudioCdVolumeEditor.cs:64 msgid "Duration:" msgstr "" #: src/Gui/Widgets/Editors/VolumeEditor.cs:45 msgid "Backup" msgstr "גיבוי" #: src/Gui/Widgets/Editors/VolumeEditor.cs:46 #: src/Gui/Widgets/CategoryView.cs:60 msgid "Documents" msgstr "מסמכים" #: src/Gui/Widgets/Editors/VolumeEditor.cs:47 #: src/Gui/Widgets/CategoryView.cs:61 msgid "Music" msgstr "מוסיקה" #: src/Gui/Widgets/Editors/VolumeEditor.cs:48 msgid "Audiobooks" msgstr "" #: src/Gui/Widgets/Editors/VolumeEditor.cs:49 #: src/Gui/Widgets/CategoryView.cs:62 msgid "Movies" msgstr "סרטים" #: src/Gui/Widgets/Editors/VolumeEditor.cs:50 msgid "Videos" msgstr "" #: src/Gui/Widgets/Editors/VolumeEditor.cs:51 msgid "Pictures" msgstr "תמונות" #: src/Gui/Widgets/Editors/VolumeEditor.cs:52 msgid "Games" msgstr "" #: src/Gui/Widgets/Editors/VolumeEditor.cs:53 src/Gui/Widgets/ItemInfo.cs:319 msgid "Software" msgstr "" #: src/Gui/Widgets/Editors/VolumeEditor.cs:54 msgid "Misc" msgstr "שונות" #: src/Gui/Widgets/Editors/VolumeEditor.cs:55 msgid "Other" msgstr "אחר" #: src/Gui/Widgets/Editors/VolumeEditor.cs:225 msgid "Yes" msgstr "כן" #: src/Gui/Widgets/Editors/VolumeEditor.cs:225 msgid "No" msgstr "לא" #: src/Gui/Widgets/Editors/VolumeEditor.cs:235 msgid "Volume type:" msgstr "סוג הכרך:" #: src/Gui/Widgets/Editors/VolumeEditor.cs:236 msgid "Hashed:" msgstr "התבצע גיבוב:" #: src/Gui/Widgets/Editors/VolumeEditor.cs:237 msgid "Added:" msgstr "נוסף:" #: src/Gui/Widgets/Editors/VolumeEditor.cs:258 msgid "Archive No.:" msgstr "" #: src/Gui/Widgets/Editors/VolumeEditor.cs:260 msgid "Title:" msgstr "כותרת:" #: src/Gui/Widgets/Editors/VolumeEditor.cs:261 src/Gui/DBProperties.cs:98 msgid "Description:" msgstr "תיאור:" #: src/Gui/Widgets/Editors/VolumeEditor.cs:262 msgid "Keywords:" msgstr "מילות מפתח:" #: src/Gui/Widgets/Editors/VolumeEditor.cs:263 msgid "Loaned to:" msgstr "הושאל ל־:" #: src/Gui/Widgets/Editors/VolumeEditor.cs:264 msgid "Loaned date:" msgstr "תאריך ההשאלה:" #: src/Gui/Widgets/Editors/VolumeEditor.cs:265 msgid "Return date:" msgstr "תאריך ההחזרה:" #: src/Gui/Widgets/CategoryView.cs:58 msgid "Directories" msgstr "" #: src/Gui/Widgets/CategoryView.cs:59 msgid "Text" msgstr "" #: src/Gui/Widgets/CategoryView.cs:63 msgid "Images" msgstr "" #: src/Gui/Widgets/CategoryView.cs:64 msgid "Applications" msgstr "" #: src/Gui/Widgets/CategoryView.cs:65 msgid "Archives" msgstr "" #: src/Gui/Widgets/CategoryView.cs:66 msgid "Development" msgstr "" #: src/Gui/Widgets/CategoryView.cs:96 src/Gui/MainWindow.cs:1046 msgid "Category" msgstr "" #: src/Gui/Widgets/CategoryView.cs:128 msgid "All items" msgstr "" #: src/Gui/Widgets/SearchResultView.cs:32 msgid "Volume" msgstr "" #: src/Gui/Widgets/SearchResultView.cs:33 src/Gui/MainWindow.cs:1040 msgid "Archive No." msgstr "" #: src/Gui/Widgets/ItemInfo.cs:40 msgid "by" msgstr "" #: src/Gui/Widgets/ItemInfo.cs:41 msgid "from" msgstr "" #: src/Gui/Widgets/ItemInfo.cs:196 msgid "Symlink target" msgstr "" #: src/Gui/Widgets/ItemInfo.cs:227 msgid "Track No." msgstr "" #: src/Gui/Widgets/ItemInfo.cs:258 msgid "Genre" msgstr "" #: src/Gui/Widgets/ItemInfo.cs:278 msgid "Year" msgstr "" #: src/Gui/Widgets/ItemInfo.cs:283 msgid "Description" msgstr "" #: src/Gui/Widgets/ItemInfo.cs:294 msgid "Dimensions" msgstr "" #: src/Gui/Widgets/ItemInfo.cs:299 msgid "Format" msgstr "" #: src/Gui/Widgets/ItemInfo.cs:303 msgid "Author" msgstr "" #: src/Gui/Widgets/ItemInfo.cs:307 msgid "Copyright" msgstr "" #: src/Gui/Widgets/ItemInfo.cs:311 msgid "Producer" msgstr "" #: src/Gui/Widgets/ItemInfo.cs:315 msgid "Creator" msgstr "" #: src/Gui/Widgets/ItemInfo.cs:323 msgid "Language" msgstr "" #: src/Gui/Widgets/ItemInfo.cs:327 msgid "Page count" msgstr "" #: src/Gui/Widgets/ItemInfo.cs:346 msgid "File count" msgstr "" #: src/Gui/Widgets/PageNavigation.cs:27 msgid "No items." msgstr "" #: src/Gui/Widgets/PageNavigation.cs:145 #, csharp-format msgid "Page {0}/{1} ({2} - {3} of {4} items)" msgstr "" #: src/Gui/ObjectProperties.cs:54 src/Gui/VolumeScanner.cs:248 msgid "Invalid data" msgstr "נתונים שגויים" #: src/Gui/ObjectProperties.cs:54 src/Gui/VolumeScanner.cs:249 #, csharp-format msgid "" "\"{0}\" is {1}.\n" "\n" "Expected format: {2}\n" "Please correct or remove the data you entered." msgstr "" "\"{0}\" הינו {1}.\n" "\n" "המבנה הצפוי: {2}\n" "נא תקן או הסר את הנתונים שהזנת." #: src/Gui/DBProperties.cs:85 msgid "Database Properties" msgstr "מאפייני מסד הנתונים" #: src/Gui/DBProperties.cs:97 msgid "Name:" msgstr "שם:" #: src/Gui/DBProperties.cs:99 msgid "Created:" msgstr "נוצר:" #: src/Gui/VolumeProperties.cs:29 msgid "Volume Properties" msgstr "מאפייני הכרך" #: src/Gui/DriveSelection.cs:60 msgid "Waiting for drives..." msgstr "ממתין לכוננים..." #: src/Gui/DriveSelection.cs:133 msgid "Drive" msgstr "כונן" #: src/Gui/DriveSelection.cs:139 msgid "Label" msgstr "תווית" #: src/Gui/DriveSelection.cs:241 msgid "Please select a drive to scan" msgstr "אנא בחר כונן לסריקה" #: src/Gui/About.cs:28 msgid "A cross-platform media indexing/search tool." msgstr "" #: src/Gui/About.cs:29 #, csharp-format msgid "Using VolumeDB v{0}." msgstr "משתמש ב־VolumeDB גירסה {0}." #: src/Gui/About.cs:31 msgid "Copyright (c) " msgstr "כל הזכויות שמורות (c) " #: src/Gui/ItemSearch.cs:81 #, csharp-format msgid "Found {0} items in {1:F3} seconds." msgstr "נמצאו {0} תוך {1:F3} שניות." #: src/Gui/ItemSearch.cs:92 src/Gui/MainWindow.cs:519 msgid "Timeout: another search is probably still in progress." msgstr "תום הזמן: כנראה ומתבצע חיפוש נוסף כרגע." #: src/Gui/ItemSearch.cs:94 msgid "Too many search results. Please refine your search criteria." msgstr "" #: src/Gui/ItemSearch.cs:112 src/Gui/MainWindow.cs:535 msgid "Searching..." msgstr "מחפש..." #: src/Gui/ItemSearch.cs:267 msgid "Search Items" msgstr "חיפוש פריטים" #: src/Gui/ItemSearch.cs:279 src/Gui/MainWindow.cs:1145 msgid "default" msgstr "" #: src/Gui/ItemSearch.cs:283 msgid "Search items" msgstr "" #: src/Gui/ItemSearch.cs:318 msgid "Quick tip:" msgstr "" #: src/Gui/ItemSearch.cs:319 #, csharp-format msgid "" "Click on the icon to the left of the search field to build advanced search " "queries.\n" "Example: {0}" msgstr "" #: src/Gui/ItemSearch.cs:326 msgid "No search results." msgstr "" #: src/Gui/ItemSearch.cs:375 src/Gui/MainWindow.cs:1028 msgid "Edit Item" msgstr "" #: src/Gui/ItemSearch.cs:382 msgid "Show in Main Window" msgstr "" #: src/Gui/MainWindow.cs:77 src/Gui/MainWindow.cs:93 src/Gui/MainWindow.cs:635 #, csharp-format msgid "Database '{0}' not found." msgstr "מסד הנתונים '{0}' לא נמצא." #: src/Gui/MainWindow.cs:185 msgid "Database not found" msgstr "" #: src/Gui/MainWindow.cs:186 msgid "Default database not found. Create?" msgstr "" #: src/Gui/MainWindow.cs:215 msgid "Unsupported database version" msgstr "גירסת מסד הנתונים לא נתמכת" #: src/Gui/MainWindow.cs:216 msgid "This database version is not supported." msgstr "גירסת מסד נתונים זו אינה נתמכת." #: src/Gui/MainWindow.cs:235 #, csharp-format msgid "{0} volumes loaded." msgstr "נטענו {0} כרכים." #: src/Gui/MainWindow.cs:256 #, csharp-format msgid "An error occured while loading the volume list: {0}" msgstr "" #: src/Gui/MainWindow.cs:300 msgid "Please enter the name for the new database" msgstr "נא הזן את שם מסד הנתונים החדש" #: src/Gui/MainWindow.cs:312 msgid "Database exists" msgstr "מסד הנתונים קיים" #: src/Gui/MainWindow.cs:313 msgid "Database already exists. Overwrite?" msgstr "מסד הנתונים כבר קיים. לשכתב?" #: src/Gui/MainWindow.cs:326 msgid "Please select a database" msgstr "אנא בחר מסד נתונים" #: src/Gui/MainWindow.cs:335 src/Gui/Import.cs:83 msgid "Database not found." msgstr "מסד הנתונים לא נמצא." #: src/Gui/MainWindow.cs:356 #, csharp-format msgid "" "An error occured while accessing drive {0}:\n" "{1}" msgstr "" "ארעה שגיאה בעת הגישה לכונן {0}:\n" "{1}" #: src/Gui/MainWindow.cs:378 #, csharp-format msgid "Drive {0} is not ready." msgstr "הכונן {0} אינו מוכן." #: src/Gui/MainWindow.cs:387 #, csharp-format msgid "Drive {0} is neither mounted nor does it contain an audio cd." msgstr "" #: src/Gui/MainWindow.cs:406 msgid "Confirmation" msgstr "אישור" #: src/Gui/MainWindow.cs:407 msgid "Are you sure you really want to remove the selected volume?" msgstr "האם אתה בטוח שברצונך להסיר את הכרך הנבחר?" #: src/Gui/MainWindow.cs:712 #, csharp-format msgid "Please insert volume '{0}'." msgstr "" #: src/Gui/MainWindow.cs:714 msgid "Waiting for volume" msgstr "" #: src/Gui/MainWindow.cs:966 msgid "Add Volume" msgstr "" #: src/Gui/MainWindow.cs:970 msgid "Search" msgstr "" #: src/Gui/MainWindow.cs:973 msgid "App Menu" msgstr "" #: src/Gui/MainWindow.cs:979 msgid "_New Database" msgstr "מסד נתונים _חדש" #: src/Gui/MainWindow.cs:982 msgid "_Open Database" msgstr "_פתח מסד נתונים" #: src/Gui/MainWindow.cs:985 msgid "Open Default Database" msgstr "" #: src/Gui/MainWindow.cs:991 msgid "Recent Databases" msgstr "" #: src/Gui/MainWindow.cs:998 msgid "_Import" msgstr "" #: src/Gui/MainWindow.cs:1001 msgid "_Preferences" msgstr "הע_דפות" #: src/Gui/MainWindow.cs:1004 msgid "_Database Properties" msgstr "_מאפייני מסד הנתונים" #: src/Gui/MainWindow.cs:1007 msgid "Info" msgstr "" #: src/Gui/MainWindow.cs:1010 msgid "_Quit" msgstr "י_ציאה" #: src/Gui/MainWindow.cs:1016 msgid "_Edit Volume" msgstr "" #: src/Gui/MainWindow.cs:1019 msgid "_Remove Volume" msgstr "ה_סר כרך" #: src/Gui/MainWindow.cs:1022 msgid "Rescan Volume" msgstr "" #: src/Gui/MainWindow.cs:1034 msgid "Sort by" msgstr "" #: src/Gui/MainWindow.cs:1037 msgid "Descending" msgstr "" #: src/Gui/MainWindow.cs:1043 msgid "Date added" msgstr "" #: src/Gui/MainWindow.cs:1044 msgid "Title" msgstr "" #: src/Gui/MainWindow.cs:1045 msgid "Drivetype" msgstr "" #: src/Gui/MainWindow.cs:1142 msgid "Filter volumes" msgstr "" #: src/Gui/Import.cs:29 msgid "Import" msgstr "" #: src/Gui/Import.cs:30 msgid "Abort" msgstr "" #: src/Gui/Import.cs:31 msgid "Please select a database." msgstr "" #: src/Gui/Import.cs:72 #, csharp-format msgid "{0:0}% completed." msgstr "" #: src/Gui/Import.cs:82 msgid "Import failed" msgstr "" #: src/Gui/Import.cs:85 msgid "Import failed!" msgstr "" #: src/Gui/Import.cs:87 msgid "Import aborted." msgstr "" #: src/Gui/Import.cs:89 msgid "Import completed successfully." msgstr "" #: src/Gui/Import.cs:121 msgid "Import in progress" msgstr "" #: src/Gui/Import.cs:122 msgid "You must stop the import before closing this window." msgstr "" #: src/Gui/Import.cs:148 msgid "Unknown format." msgstr "" #: src/Gui/Import.cs:175 msgid "Import Database" msgstr "" #: src/Gui/Import.cs:186 msgid "Please select a database to import" msgstr "" #: src/Gui/Import.cs:194 msgid "All supported formats" msgstr "" #: src/Gui/Import.cs:198 #, csharp-format msgid ".{0} files" msgstr "" #: src/Gui/Import.cs:209 msgid "Database:" msgstr "" #: src/Gui/Import.cs:210 msgid "Format:" msgstr "" #: src/Gui/ItemProperties.cs:29 msgid "Item Properties" msgstr "" #: src/Gui/VolumeScanner.cs:116 msgid "Scanning started." msgstr "" #: src/Gui/VolumeScanner.cs:118 #, csharp-format msgid "Scanning of drive '{0}' started." msgstr "" #: src/Gui/VolumeScanner.cs:124 #, csharp-format msgid "" "Options: generate thumbs: {0}, extract metadata: {1}, discard symlinks: {2}, " "hashing: {3}." msgstr "" #: src/Gui/VolumeScanner.cs:131 #, csharp-format msgid "Options: MusicBrainz enabled: {0}" msgstr "" #: src/Gui/VolumeScanner.cs:157 msgid "Time" msgstr "זמן" #: src/Gui/VolumeScanner.cs:161 msgid "Message" msgstr "הודעה" #: src/Gui/VolumeScanner.cs:258 msgid "Stopping Scanner and performing rollback..." msgstr "מבטל את פעולת הסורק ומבצע שיחזור של הנתונים..." #: src/Gui/VolumeScanner.cs:268 msgid "yes" msgstr "כן" #: src/Gui/VolumeScanner.cs:268 msgid "no" msgstr "לא" #: src/Gui/VolumeScanner.cs:291 msgid "Scan in progress" msgstr "הסריקה בתהליכים" #: src/Gui/VolumeScanner.cs:291 msgid "You must stop scanning before closing this window." msgstr "עליך לעצור את הסריקה בטרם סגירת החלון." #: src/Gui/VolumeScanner.cs:346 #, csharp-format msgid "An unhandled exception occured ({0})." msgstr "ארעה חריגה בלתי מטופלת ({0})." #: src/Gui/VolumeScanner.cs:347 msgid "All database changes have been rolled back." msgstr "כל השינויים במסד הנתונים שוחזרו לנתונים המקוריים." #: src/Gui/VolumeScanner.cs:354 #, csharp-format msgid "Scanning failed. Reason: an unhandled exception occured ({0})." msgstr "הסריקה נכשלה. סיבה: ארעה חריגה בלתי מטופלת ({0})." #: src/Gui/VolumeScanner.cs:356 msgid "Scanning aborted." msgstr "הסריקה בוטלה." #: src/Gui/VolumeScanner.cs:358 msgid "Scanning completed successfully." msgstr "הסריקה הושלמה בהצלחה." #: src/Gui/VolumeScanner.cs:488 msgid "VolumeScanner" msgstr "סורק־הכרכים" #: src/Gui/VolumeScanner.cs:500 msgid "Volume Information:" msgstr "נתוני הכרך:" #: src/Gui/VolumeScanner.cs:510 msgid "Scanner Log:" msgstr "רישום הסורק:" #: src/Gui/VolumeScanner.cs:527 msgid "Database access" msgstr "גישה למסד הנתונים" #: src/Gui/Preferences.cs:119 msgid "None" msgstr "ללא" #: src/Gui/Preferences.cs:228 msgid "Unsupported theme" msgstr "" #: src/Gui/Preferences.cs:229 msgid "The selected icon theme is currently not supported on your system." msgstr "" #: src/Gui/Preferences.cs:267 msgid "Restart required" msgstr "נדרשת הפעלה מחדש" #: src/Gui/Preferences.cs:268 #, csharp-format msgid "You must restart {0} for icontheme changes to take effect." msgstr "עליך לאתחל את {0} כדי שערכת הסמלים תכנס לתוקף" #: src/Gui/Preferences.cs:298 msgid "Preferences" msgstr "העדפות" #: src/Gui/Preferences.cs:322 msgid "_Load Defaults" msgstr "טען _ברירות מחדל" #: src/Gui/Preferences.cs:349 msgid "Icon theme:" msgstr "ערכת הסמלים:" #: src/Gui/Preferences.cs:355 msgid "Reopen most recent database on startup" msgstr "פתח מחדש את מסד הנתונים העדכני ביותר עם ההפעלה" #: src/Gui/Preferences.cs:359 msgid "Show iteminfo panel" msgstr "" #: src/Gui/Preferences.cs:363 msgid "Show hidden files" msgstr "" #: src/Gui/Preferences.cs:367 msgid "Show thumbnails in the filebrowser" msgstr "" #: src/Gui/Preferences.cs:370 msgid "General" msgstr "כללי" #: src/Gui/Preferences.cs:378 msgid "Don't prompt, always scan:" msgstr "אל תודיע, סרוק תמיד:" #: src/Gui/Preferences.cs:397 msgid "Generate Thumbnails" msgstr "ייצר תמונות ממוזערות" #: src/Gui/Preferences.cs:401 msgid "Extract metadata" msgstr "" #: src/Gui/Preferences.cs:405 msgid "Discard symbolic links" msgstr "התעלם מקישורים סמליים" #: src/Gui/Preferences.cs:409 msgid "Compute hashcodes for files (slow!)" msgstr "חשב צפני גיבוב לקבצים (איטי!)" #: src/Gui/Preferences.cs:413 msgid "Fetch audio cd metadata from MusicBrainz.org" msgstr "" #: src/Gui/Preferences.cs:416 msgid "Scanner" msgstr "סורק" Basenji/po/es.po0000664000175000017500000005320212067326706013707 0ustar patrickpatrick# Spanish translation for basenji # Copyright (c) 2009 Rosetta Contributors and Canonical Ltd 2009 # This file is distributed under the same license as the basenji package. # FIRST AUTHOR , 2009. # msgid "" msgstr "" "Project-Id-Version: basenji\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2012-07-15 15:49+0200\n" "PO-Revision-Date: 2012-11-13 00:40+0000\n" "Last-Translator: Guillermo Espertino (Gez) \n" "Language-Team: Spanish \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2012-11-18 12:32+0000\n" "X-Generator: Launchpad (build 16278)\n" #: src/Util.cs:30 #, csharp-format msgid "{0} Bytes" msgstr "{0} Bytes" #: src/Util.cs:32 msgid "Bytes" msgstr "Bytes" #: src/Util.cs:32 msgid "KB" msgstr "KB" #: src/Util.cs:32 msgid "MB" msgstr "MB" #: src/Util.cs:32 msgid "GB" msgstr "GB" #: src/Util.cs:32 msgid "TB" msgstr "TB" #: src/Options.cs:477 msgid "OptionName" msgstr "OptionName" #: src/FileDialog.cs:51 msgid "VolumeDatabase files" msgstr "Archivos de base de datos del volumen" #: src/FileDialog.cs:56 msgid "All files" msgstr "Todos los archivos" #: src/Main.cs:142 src/Gui/MainWindow.cs:76 src/Gui/MainWindow.cs:92 #: src/Gui/MainWindow.cs:334 src/Gui/MainWindow.cs:355 #: src/Gui/MainWindow.cs:377 src/Gui/MainWindow.cs:386 #: src/Gui/MainWindow.cs:635 msgid "Error" msgstr "Error" #: src/Main.cs:142 #, csharp-format msgid "{0} is already running." msgstr "{0} ya se está ejecutando." #: src/Gui/Widgets/VolumeView.cs:42 src/Gui/Widgets/SearchResultView.cs:30 msgid "Unnamed" msgstr "Sin nombre" #: src/Gui/Widgets/VolumeView.cs:43 #: src/Gui/Widgets/Editors/VolumeEditor.cs:259 msgid "Category:" msgstr "Categoría:" #: src/Gui/Widgets/VolumeView.cs:44 msgid "files" msgstr "archivos" #: src/Gui/Widgets/VolumeView.cs:45 msgid "tracks" msgstr "pistas" #: src/Gui/Widgets/ItemView.cs:29 msgid "Loading..." msgstr "Cargando…" #: src/Gui/Widgets/ItemView.cs:30 msgid "(empty)" msgstr "(vacío)" #: src/Gui/Widgets/ItemView.cs:99 src/Gui/DriveSelection.cs:80 msgid "Unknown" msgstr "Desconocido" #: src/Gui/Widgets/ItemView.cs:170 src/Gui/Widgets/Editors/ItemEditor.cs:96 msgid "Name" msgstr "Nombre" #: src/Gui/Widgets/ItemView.cs:176 msgid "Artist" msgstr "Artista" #: src/Gui/Widgets/ItemView.cs:181 #: src/Gui/Widgets/Editors/AudioTrackItemEditor.cs:53 #: src/Gui/Widgets/ItemInfo.cs:225 src/Gui/Widgets/ItemInfo.cs:288 msgid "Duration" msgstr "Duración" #: src/Gui/Widgets/Editors/FileSystemVolumeEditor.cs:34 #: src/Gui/DriveSelection.cs:168 msgid "Filesystem" msgstr "Sistema de archivos" #: src/Gui/Widgets/Editors/FileSystemVolumeEditor.cs:65 msgid "Files:" msgstr "Archivos:" #: src/Gui/Widgets/Editors/FileSystemVolumeEditor.cs:66 msgid "Directories:" msgstr "Directorios:" #: src/Gui/Widgets/Editors/FileSystemVolumeEditor.cs:67 msgid "Total size:" msgstr "Tamaño total:" #: src/Gui/Widgets/Editors/ItemEditor.cs:95 msgid "Item type" msgstr "Tipo de elemento" #: src/Gui/Widgets/Editors/ItemEditor.cs:111 src/Gui/Widgets/ItemInfo.cs:371 msgid "Note" msgstr "Nota" #: src/Gui/Widgets/Editors/ItemEditor.cs:112 src/Gui/Widgets/ItemInfo.cs:374 msgid "Keywords" msgstr "Palabras clave" #: src/Gui/Widgets/Editors/AudioTrackItemEditor.cs:31 #: src/Gui/Widgets/SearchResultView.cs:34 msgid "Audio CD track" msgstr "Pista de CD de Audio" #: src/Gui/Widgets/Editors/AudioTrackItemEditor.cs:54 #: src/Gui/Widgets/ItemInfo.cs:230 msgid "Type" msgstr "Tipo" #: src/Gui/Widgets/Editors/DirectoryItemEditor.cs:28 msgid "Directory" msgstr "Directorio" #: src/Gui/Widgets/Editors/FileSystemItemEditor.cs:59 #: src/Gui/Widgets/SearchResultView.cs:31 src/Gui/Widgets/ItemInfo.cs:183 msgid "Location" msgstr "Ubicación" #: src/Gui/Widgets/Editors/FileSystemItemEditor.cs:60 #: src/Gui/Widgets/ItemInfo.cs:185 msgid "Last write time" msgstr "Última fecha de escritura" #: src/Gui/Widgets/Editors/FileSystemItemEditor.cs:61 #: src/Gui/Widgets/ItemInfo.cs:210 msgid "Filetype" msgstr "Tipo de archivo" #: src/Gui/Widgets/Editors/FileItemEditor.cs:31 msgid "File" msgstr "Archivo" #: src/Gui/Widgets/Editors/FileItemEditor.cs:52 #: src/Gui/Widgets/ItemInfo.cs:204 src/Gui/Widgets/ItemInfo.cs:226 #: src/Gui/DriveSelection.cs:148 msgid "Size" msgstr "Tamaño" #: src/Gui/Widgets/Editors/FileItemEditor.cs:53 #: src/Gui/Widgets/ItemInfo.cs:206 msgid "Hash" msgstr "Hash" #: src/Gui/Widgets/Editors/AudioCdVolumeEditor.cs:33 msgid "Audio CD" msgstr "CD de Audio" #: src/Gui/Widgets/Editors/AudioCdVolumeEditor.cs:63 msgid "Tracks:" msgstr "Pistas:" #: src/Gui/Widgets/Editors/AudioCdVolumeEditor.cs:64 msgid "Duration:" msgstr "Duración:" #: src/Gui/Widgets/Editors/VolumeEditor.cs:45 msgid "Backup" msgstr "Copia de Seguridad" #: src/Gui/Widgets/Editors/VolumeEditor.cs:46 #: src/Gui/Widgets/CategoryView.cs:60 msgid "Documents" msgstr "Documentos" #: src/Gui/Widgets/Editors/VolumeEditor.cs:47 #: src/Gui/Widgets/CategoryView.cs:61 msgid "Music" msgstr "Música" #: src/Gui/Widgets/Editors/VolumeEditor.cs:48 msgid "Audiobooks" msgstr "Audiolibros" #: src/Gui/Widgets/Editors/VolumeEditor.cs:49 #: src/Gui/Widgets/CategoryView.cs:62 msgid "Movies" msgstr "Películas" #: src/Gui/Widgets/Editors/VolumeEditor.cs:50 msgid "Videos" msgstr "Videos" #: src/Gui/Widgets/Editors/VolumeEditor.cs:51 msgid "Pictures" msgstr "Fotografìas" #: src/Gui/Widgets/Editors/VolumeEditor.cs:52 msgid "Games" msgstr "Juegos" #: src/Gui/Widgets/Editors/VolumeEditor.cs:53 src/Gui/Widgets/ItemInfo.cs:319 msgid "Software" msgstr "Aplicaciones" #: src/Gui/Widgets/Editors/VolumeEditor.cs:54 msgid "Misc" msgstr "Misceláneo" #: src/Gui/Widgets/Editors/VolumeEditor.cs:55 msgid "Other" msgstr "Otros" #: src/Gui/Widgets/Editors/VolumeEditor.cs:225 msgid "Yes" msgstr "Sí" #: src/Gui/Widgets/Editors/VolumeEditor.cs:225 msgid "No" msgstr "No" #: src/Gui/Widgets/Editors/VolumeEditor.cs:235 msgid "Volume type:" msgstr "Tipo de unidad:" #: src/Gui/Widgets/Editors/VolumeEditor.cs:236 msgid "Hashed:" msgstr "Hash almacenado:" #: src/Gui/Widgets/Editors/VolumeEditor.cs:237 msgid "Added:" msgstr "Añadido:" #: src/Gui/Widgets/Editors/VolumeEditor.cs:258 msgid "Archive No.:" msgstr "Nº de Archivo:" #: src/Gui/Widgets/Editors/VolumeEditor.cs:260 msgid "Title:" msgstr "Título:" #: src/Gui/Widgets/Editors/VolumeEditor.cs:261 src/Gui/DBProperties.cs:98 msgid "Description:" msgstr "Descripción" #: src/Gui/Widgets/Editors/VolumeEditor.cs:262 msgid "Keywords:" msgstr "Palabras clave:" #: src/Gui/Widgets/Editors/VolumeEditor.cs:263 msgid "Loaned to:" msgstr "Prestado a:" #: src/Gui/Widgets/Editors/VolumeEditor.cs:264 msgid "Loaned date:" msgstr "Fecha de préstamo:" #: src/Gui/Widgets/Editors/VolumeEditor.cs:265 msgid "Return date:" msgstr "Fecha de devolución:" #: src/Gui/Widgets/CategoryView.cs:58 msgid "Directories" msgstr "Carpetas" #: src/Gui/Widgets/CategoryView.cs:59 msgid "Text" msgstr "Texto" #: src/Gui/Widgets/CategoryView.cs:63 msgid "Images" msgstr "Imágenes" #: src/Gui/Widgets/CategoryView.cs:64 msgid "Applications" msgstr "Aplicaciones" #: src/Gui/Widgets/CategoryView.cs:65 msgid "Archives" msgstr "Archivos" #: src/Gui/Widgets/CategoryView.cs:66 msgid "Development" msgstr "Desarrollo" #: src/Gui/Widgets/CategoryView.cs:96 src/Gui/MainWindow.cs:1046 msgid "Category" msgstr "Categoría" #: src/Gui/Widgets/CategoryView.cs:128 msgid "All items" msgstr "Todos los objetos" #: src/Gui/Widgets/SearchResultView.cs:32 msgid "Volume" msgstr "Volúmen" #: src/Gui/Widgets/SearchResultView.cs:33 src/Gui/MainWindow.cs:1040 msgid "Archive No." msgstr "Archivo No." #: src/Gui/Widgets/ItemInfo.cs:40 msgid "by" msgstr "por" #: src/Gui/Widgets/ItemInfo.cs:41 msgid "from" msgstr "de" #: src/Gui/Widgets/ItemInfo.cs:196 msgid "Symlink target" msgstr "Objetivo Symlink" #: src/Gui/Widgets/ItemInfo.cs:227 msgid "Track No." msgstr "Pïsta No." #: src/Gui/Widgets/ItemInfo.cs:258 msgid "Genre" msgstr "Género" #: src/Gui/Widgets/ItemInfo.cs:278 msgid "Year" msgstr "Año" #: src/Gui/Widgets/ItemInfo.cs:283 msgid "Description" msgstr "Descripción" #: src/Gui/Widgets/ItemInfo.cs:294 msgid "Dimensions" msgstr "Dimensiones" #: src/Gui/Widgets/ItemInfo.cs:299 msgid "Format" msgstr "Formato" #: src/Gui/Widgets/ItemInfo.cs:303 msgid "Author" msgstr "Autor" #: src/Gui/Widgets/ItemInfo.cs:307 msgid "Copyright" msgstr "Derechos de autor" #: src/Gui/Widgets/ItemInfo.cs:311 msgid "Producer" msgstr "Productor" #: src/Gui/Widgets/ItemInfo.cs:315 msgid "Creator" msgstr "Creador" #: src/Gui/Widgets/ItemInfo.cs:323 msgid "Language" msgstr "Idioma" #: src/Gui/Widgets/ItemInfo.cs:327 msgid "Page count" msgstr "Conteo de páginas" #: src/Gui/Widgets/ItemInfo.cs:346 msgid "File count" msgstr "Conteo de archivos" #: src/Gui/Widgets/PageNavigation.cs:27 msgid "No items." msgstr "Sin artículos." #: src/Gui/Widgets/PageNavigation.cs:145 #, csharp-format msgid "Page {0}/{1} ({2} - {3} of {4} items)" msgstr "Página {0}/{1} ({2} - {3} de {4} artículos)" #: src/Gui/ObjectProperties.cs:54 src/Gui/VolumeScanner.cs:248 msgid "Invalid data" msgstr "Datos inválidos" #: src/Gui/ObjectProperties.cs:54 src/Gui/VolumeScanner.cs:249 #, csharp-format msgid "" "\"{0}\" is {1}.\n" "\n" "Expected format: {2}\n" "Please correct or remove the data you entered." msgstr "" "\"{0}\" es {1}.\n" "\n" "Formato esperado: {2}\n" "Corrija o elimine los datos que introdujo." #: src/Gui/DBProperties.cs:85 msgid "Database Properties" msgstr "Propiedades de la base de datos" #: src/Gui/DBProperties.cs:97 msgid "Name:" msgstr "Nombre:" #: src/Gui/DBProperties.cs:99 msgid "Created:" msgstr "Creado:" #: src/Gui/VolumeProperties.cs:29 msgid "Volume Properties" msgstr "Propiedades del volumen" #: src/Gui/DriveSelection.cs:60 msgid "Waiting for drives..." msgstr "Esperando unidades..." #: src/Gui/DriveSelection.cs:133 msgid "Drive" msgstr "Unidad" #: src/Gui/DriveSelection.cs:139 msgid "Label" msgstr "Etiqueta" #: src/Gui/DriveSelection.cs:241 msgid "Please select a drive to scan" msgstr "Seleccione una unidad para escanear" #: src/Gui/About.cs:28 msgid "A cross-platform media indexing/search tool." msgstr "Una herramienta de búsqueda/indexado multi-plataforma de medios" #: src/Gui/About.cs:29 #, csharp-format msgid "Using VolumeDB v{0}." msgstr "Usando VolumeDB v{0}." #: src/Gui/About.cs:31 msgid "Copyright (c) " msgstr "Copyright (c) " #: src/Gui/ItemSearch.cs:81 #, csharp-format msgid "Found {0} items in {1:F3} seconds." msgstr "Encomntrados {0} elementos en {1:F3} segundos." #: src/Gui/ItemSearch.cs:92 src/Gui/MainWindow.cs:519 msgid "Timeout: another search is probably still in progress." msgstr "Tiempo agotado: probablemente haya otra búsqueda en progreso." #: src/Gui/ItemSearch.cs:94 msgid "Too many search results. Please refine your search criteria." msgstr "" "Demasiados resultados para la búsqueda. Por favor, refine sus criterios de " "búsqueda." #: src/Gui/ItemSearch.cs:112 src/Gui/MainWindow.cs:535 msgid "Searching..." msgstr "Buscando..." #: src/Gui/ItemSearch.cs:267 msgid "Search Items" msgstr "Buscar Elementos" #: src/Gui/ItemSearch.cs:279 src/Gui/MainWindow.cs:1145 msgid "default" msgstr "predeterminado" #: src/Gui/ItemSearch.cs:283 msgid "Search items" msgstr "Buscar items" #: src/Gui/ItemSearch.cs:318 msgid "Quick tip:" msgstr "Consejo rápido:" #: src/Gui/ItemSearch.cs:319 #, csharp-format msgid "" "Click on the icon to the left of the search field to build advanced search " "queries.\n" "Example: {0}" msgstr "" #: src/Gui/ItemSearch.cs:326 msgid "No search results." msgstr "No hay resultados de la búsqueda." #: src/Gui/ItemSearch.cs:375 src/Gui/MainWindow.cs:1028 msgid "Edit Item" msgstr "Editar Elemento" #: src/Gui/ItemSearch.cs:382 msgid "Show in Main Window" msgstr "Mostrar en la Ventana Principal" #: src/Gui/MainWindow.cs:77 src/Gui/MainWindow.cs:93 src/Gui/MainWindow.cs:635 #, csharp-format msgid "Database '{0}' not found." msgstr "Base de datos '{0}' no encontrada." #: src/Gui/MainWindow.cs:185 msgid "Database not found" msgstr "Base de datos no encontrada" #: src/Gui/MainWindow.cs:186 msgid "Default database not found. Create?" msgstr "" "La base de datos predeterminada no se ha encontrado. ¿Quiere crear una?" #: src/Gui/MainWindow.cs:215 msgid "Unsupported database version" msgstr "Versión de la base de datos no soportada" #: src/Gui/MainWindow.cs:216 msgid "This database version is not supported." msgstr "La versión de esta base de datos no está soportada." #: src/Gui/MainWindow.cs:235 #, csharp-format msgid "{0} volumes loaded." msgstr "{0} volúmenes cargados." #: src/Gui/MainWindow.cs:256 #, csharp-format msgid "An error occured while loading the volume list: {0}" msgstr "Un error ocurrió mientras se cargaba la lista de de volúmenes: {0}" #: src/Gui/MainWindow.cs:300 msgid "Please enter the name for the new database" msgstr "Introduzca el nombre de la nueva base de datos" #: src/Gui/MainWindow.cs:312 msgid "Database exists" msgstr "La base de datos existe" #: src/Gui/MainWindow.cs:313 msgid "Database already exists. Overwrite?" msgstr "La base de datos ya existe. ¿Sobrescribir?" #: src/Gui/MainWindow.cs:326 msgid "Please select a database" msgstr "Seleccione una base de datos" #: src/Gui/MainWindow.cs:335 src/Gui/Import.cs:83 msgid "Database not found." msgstr "Base de datos no encontrada." #: src/Gui/MainWindow.cs:356 #, csharp-format msgid "" "An error occured while accessing drive {0}:\n" "{1}" msgstr "" "Ocurrió un error mientras se accedia a la unidad {0}:\n" "{1}" #: src/Gui/MainWindow.cs:378 #, csharp-format msgid "Drive {0} is not ready." msgstr "La unidad {0} no está lista." #: src/Gui/MainWindow.cs:387 #, csharp-format msgid "Drive {0} is neither mounted nor does it contain an audio cd." msgstr "El drive {0} no esta montado o no contiene un cd de audio.." #: src/Gui/MainWindow.cs:406 msgid "Confirmation" msgstr "Confirmación" #: src/Gui/MainWindow.cs:407 msgid "Are you sure you really want to remove the selected volume?" msgstr "" "¿Está realmente seguro de que quiere eliminar el volumen seleccionado?" #: src/Gui/MainWindow.cs:712 #, csharp-format msgid "Please insert volume '{0}'." msgstr "Por favor inserte el volumen '{0}'." #: src/Gui/MainWindow.cs:714 msgid "Waiting for volume" msgstr "Esperando el volumen" #: src/Gui/MainWindow.cs:966 msgid "Add Volume" msgstr "Agregar Volumen" #: src/Gui/MainWindow.cs:970 msgid "Search" msgstr "Buscar" #: src/Gui/MainWindow.cs:973 msgid "App Menu" msgstr "Menú de la Aplicación" #: src/Gui/MainWindow.cs:979 msgid "_New Database" msgstr "_Nueva Base de Datos" #: src/Gui/MainWindow.cs:982 msgid "_Open Database" msgstr "_Abrir base de datos" #: src/Gui/MainWindow.cs:985 msgid "Open Default Database" msgstr "Abrir base de datos predeterminada" #: src/Gui/MainWindow.cs:991 msgid "Recent Databases" msgstr "Bases de datos recientes" #: src/Gui/MainWindow.cs:998 msgid "_Import" msgstr "_Importar" #: src/Gui/MainWindow.cs:1001 msgid "_Preferences" msgstr "_Preferencias" #: src/Gui/MainWindow.cs:1004 msgid "_Database Properties" msgstr "_Propiedades de la Base de Datos" #: src/Gui/MainWindow.cs:1007 msgid "Info" msgstr "Información" #: src/Gui/MainWindow.cs:1010 msgid "_Quit" msgstr "_Salir" #: src/Gui/MainWindow.cs:1016 msgid "_Edit Volume" msgstr "_Editar volumen" #: src/Gui/MainWindow.cs:1019 msgid "_Remove Volume" msgstr "_Eliminar volumen" #: src/Gui/MainWindow.cs:1022 msgid "Rescan Volume" msgstr "Reanalizar el Volumen" #: src/Gui/MainWindow.cs:1034 msgid "Sort by" msgstr "Ordenar por" #: src/Gui/MainWindow.cs:1037 msgid "Descending" msgstr "Descendente" #: src/Gui/MainWindow.cs:1043 msgid "Date added" msgstr "Fecha de Añadido" #: src/Gui/MainWindow.cs:1044 msgid "Title" msgstr "Titulo" #: src/Gui/MainWindow.cs:1045 msgid "Drivetype" msgstr "Tipo de Unidad" #: src/Gui/MainWindow.cs:1142 msgid "Filter volumes" msgstr "Filtrar volúmenes" #: src/Gui/Import.cs:29 msgid "Import" msgstr "Importar" #: src/Gui/Import.cs:30 msgid "Abort" msgstr "Anular" #: src/Gui/Import.cs:31 msgid "Please select a database." msgstr "Por favor, seleccione una base de datos." #: src/Gui/Import.cs:72 #, csharp-format msgid "{0:0}% completed." msgstr "{0:0}% completado." #: src/Gui/Import.cs:82 msgid "Import failed" msgstr "Error al importar" #: src/Gui/Import.cs:85 msgid "Import failed!" msgstr "¡Error al importar!" #: src/Gui/Import.cs:87 msgid "Import aborted." msgstr "Importación anulada" #: src/Gui/Import.cs:89 msgid "Import completed successfully." msgstr "Importación finalizada con éxito." #: src/Gui/Import.cs:121 msgid "Import in progress" msgstr "Importación en progreso" #: src/Gui/Import.cs:122 msgid "You must stop the import before closing this window." msgstr "Debe detener la importación antes de cerrar esta ventana." #: src/Gui/Import.cs:148 msgid "Unknown format." msgstr "Formato desconocido." #: src/Gui/Import.cs:175 msgid "Import Database" msgstr "Importar base de datos" #: src/Gui/Import.cs:186 msgid "Please select a database to import" msgstr "Por favor seleccione una base de datos a importar" #: src/Gui/Import.cs:194 msgid "All supported formats" msgstr "Todos los formatos soportados" #: src/Gui/Import.cs:198 #, csharp-format msgid ".{0} files" msgstr ".{0} archivos" #: src/Gui/Import.cs:209 msgid "Database:" msgstr "Base de datos:" #: src/Gui/Import.cs:210 msgid "Format:" msgstr "Formato:" #: src/Gui/ItemProperties.cs:29 msgid "Item Properties" msgstr "Propiedades del elemento" #: src/Gui/VolumeScanner.cs:116 msgid "Scanning started." msgstr "Escaneo iniciado." #: src/Gui/VolumeScanner.cs:118 #, csharp-format msgid "Scanning of drive '{0}' started." msgstr "Escaneo del disco '{0}' iniciado." #: src/Gui/VolumeScanner.cs:124 #, csharp-format msgid "" "Options: generate thumbs: {0}, extract metadata: {1}, discard symlinks: {2}, " "hashing: {3}." msgstr "" "Opciones: generar miniaturas: {0}, extraer metadata: {1}, descartar " "symlinks: {2}, generar hash: {3}." #: src/Gui/VolumeScanner.cs:131 #, csharp-format msgid "Options: MusicBrainz enabled: {0}" msgstr "Opciones: MusicBrainz habilitado: {0}" #: src/Gui/VolumeScanner.cs:157 msgid "Time" msgstr "Tiempo" #: src/Gui/VolumeScanner.cs:161 msgid "Message" msgstr "Mensaje" #: src/Gui/VolumeScanner.cs:258 msgid "Stopping Scanner and performing rollback..." msgstr "Deteniendo escáner y revirtiendo..." #: src/Gui/VolumeScanner.cs:268 msgid "yes" msgstr "si" #: src/Gui/VolumeScanner.cs:268 msgid "no" msgstr "no" #: src/Gui/VolumeScanner.cs:291 msgid "Scan in progress" msgstr "Escaneado en progreso" #: src/Gui/VolumeScanner.cs:291 msgid "You must stop scanning before closing this window." msgstr "Debe detener el escaneado para cerrar esta ventana." #: src/Gui/VolumeScanner.cs:346 #, csharp-format msgid "An unhandled exception occured ({0})." msgstr "Una inmanejable excepción a ocurrido ({0})." #: src/Gui/VolumeScanner.cs:347 msgid "All database changes have been rolled back." msgstr "Todos los cambios a la base de datos han sido revertidos." #: src/Gui/VolumeScanner.cs:354 #, csharp-format msgid "Scanning failed. Reason: an unhandled exception occured ({0})." msgstr "" "El escaneo ha fallado. Razón: Una excepción inesperada ha ocurrido ({0})." #: src/Gui/VolumeScanner.cs:356 msgid "Scanning aborted." msgstr "Escaneado abortado." #: src/Gui/VolumeScanner.cs:358 msgid "Scanning completed successfully." msgstr "El escaneado se completo satisfactoriamente." #: src/Gui/VolumeScanner.cs:488 msgid "VolumeScanner" msgstr "Escaneador de Unidades" #: src/Gui/VolumeScanner.cs:500 msgid "Volume Information:" msgstr "Información de Unidades:" #: src/Gui/VolumeScanner.cs:510 msgid "Scanner Log:" msgstr "Registro de Escaneado:" #: src/Gui/VolumeScanner.cs:527 msgid "Database access" msgstr "Acceso a la Base de Datos" #: src/Gui/Preferences.cs:119 msgid "None" msgstr "Ninguno" #: src/Gui/Preferences.cs:228 msgid "Unsupported theme" msgstr "Tema no soportado" #: src/Gui/Preferences.cs:229 msgid "The selected icon theme is currently not supported on your system." msgstr "" "El tema de íconos actualmente seleccionado no es soportado por su sistema." #: src/Gui/Preferences.cs:267 msgid "Restart required" msgstr "Se requiere reiniciar" #: src/Gui/Preferences.cs:268 #, csharp-format msgid "You must restart {0} for icontheme changes to take effect." msgstr "" "Debe reiniciar {0} para que tengan efecto los cambios del tema de iconos." #: src/Gui/Preferences.cs:298 msgid "Preferences" msgstr "Preferencias" #: src/Gui/Preferences.cs:322 msgid "_Load Defaults" msgstr "_Cargar opciones por defecto" #: src/Gui/Preferences.cs:349 msgid "Icon theme:" msgstr "Tema de iconos:" #: src/Gui/Preferences.cs:355 msgid "Reopen most recent database on startup" msgstr "Abrir base de datos más reciente al iniciar" #: src/Gui/Preferences.cs:359 msgid "Show iteminfo panel" msgstr "Mostrar panel de información del ítem." #: src/Gui/Preferences.cs:363 msgid "Show hidden files" msgstr "Mostrar archivos ocultos" #: src/Gui/Preferences.cs:367 msgid "Show thumbnails in the filebrowser" msgstr "Mostrar miniaturas en el explorador de archivos" #: src/Gui/Preferences.cs:370 msgid "General" msgstr "General" #: src/Gui/Preferences.cs:378 msgid "Don't prompt, always scan:" msgstr "No preguntar, escanear siempre:" #: src/Gui/Preferences.cs:397 msgid "Generate Thumbnails" msgstr "Generar miniaturas" #: src/Gui/Preferences.cs:401 msgid "Extract metadata" msgstr "Extraer metadatos" #: src/Gui/Preferences.cs:405 msgid "Discard symbolic links" msgstr "Descartar enlaces simbólicos" #: src/Gui/Preferences.cs:409 msgid "Compute hashcodes for files (slow!)" msgstr "Computar hashcodes para los archivos (¡lento!)" #: src/Gui/Preferences.cs:413 msgid "Fetch audio cd metadata from MusicBrainz.org" msgstr "Buscar metadata del cd de audio desde MusicBrainz.org" #: src/Gui/Preferences.cs:416 msgid "Scanner" msgstr "Escáner" Basenji/po/hu.po0000664000175000017500000005242712067326706013724 0ustar patrickpatrick# Hungarian translation for basenji # Copyright (c) 2010 Rosetta Contributors and Canonical Ltd 2010 # This file is distributed under the same license as the basenji package. # FIRST AUTHOR , 2010. # msgid "" msgstr "" "Project-Id-Version: basenji\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2012-07-15 15:49+0200\n" "PO-Revision-Date: 2010-08-17 20:28+0000\n" "Last-Translator: Patrick Ulbrich \n" "Language-Team: Hungarian \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2012-10-27 11:00+0000\n" "X-Generator: Launchpad (build 16194)\n" #: src/Util.cs:30 #, csharp-format msgid "{0} Bytes" msgstr "{0} bájt" #: src/Util.cs:32 msgid "Bytes" msgstr "bájt" #: src/Util.cs:32 msgid "KB" msgstr "KB" #: src/Util.cs:32 msgid "MB" msgstr "MB" #: src/Util.cs:32 msgid "GB" msgstr "GB" #: src/Util.cs:32 msgid "TB" msgstr "TB" #: src/Options.cs:477 msgid "OptionName" msgstr "" #: src/FileDialog.cs:51 msgid "VolumeDatabase files" msgstr "KötetAdatbázis fájlok" #: src/FileDialog.cs:56 msgid "All files" msgstr "Minden fájl" #: src/Main.cs:142 src/Gui/MainWindow.cs:76 src/Gui/MainWindow.cs:92 #: src/Gui/MainWindow.cs:334 src/Gui/MainWindow.cs:355 #: src/Gui/MainWindow.cs:377 src/Gui/MainWindow.cs:386 #: src/Gui/MainWindow.cs:635 msgid "Error" msgstr "Hiba" #: src/Main.cs:142 #, csharp-format msgid "{0} is already running." msgstr "{0} már fut." #: src/Gui/Widgets/VolumeView.cs:42 src/Gui/Widgets/SearchResultView.cs:30 msgid "Unnamed" msgstr "Névtelen" #: src/Gui/Widgets/VolumeView.cs:43 #: src/Gui/Widgets/Editors/VolumeEditor.cs:259 msgid "Category:" msgstr "Kategória:" #: src/Gui/Widgets/VolumeView.cs:44 msgid "files" msgstr "fájlok" #: src/Gui/Widgets/VolumeView.cs:45 msgid "tracks" msgstr "számok" #: src/Gui/Widgets/ItemView.cs:29 msgid "Loading..." msgstr "Betöltés…" #: src/Gui/Widgets/ItemView.cs:30 msgid "(empty)" msgstr "(üres)" #: src/Gui/Widgets/ItemView.cs:99 src/Gui/DriveSelection.cs:80 msgid "Unknown" msgstr "Ismeretlen" #: src/Gui/Widgets/ItemView.cs:170 src/Gui/Widgets/Editors/ItemEditor.cs:96 msgid "Name" msgstr "Név" #: src/Gui/Widgets/ItemView.cs:176 msgid "Artist" msgstr "Előadó" #: src/Gui/Widgets/ItemView.cs:181 #: src/Gui/Widgets/Editors/AudioTrackItemEditor.cs:53 #: src/Gui/Widgets/ItemInfo.cs:225 src/Gui/Widgets/ItemInfo.cs:288 msgid "Duration" msgstr "Hossz" #: src/Gui/Widgets/Editors/FileSystemVolumeEditor.cs:34 #: src/Gui/DriveSelection.cs:168 msgid "Filesystem" msgstr "Fájlrendszer" #: src/Gui/Widgets/Editors/FileSystemVolumeEditor.cs:65 msgid "Files:" msgstr "Fájlok:" #: src/Gui/Widgets/Editors/FileSystemVolumeEditor.cs:66 msgid "Directories:" msgstr "Könyvtárak:" #: src/Gui/Widgets/Editors/FileSystemVolumeEditor.cs:67 msgid "Total size:" msgstr "Teljes méret:" #: src/Gui/Widgets/Editors/ItemEditor.cs:95 msgid "Item type" msgstr "Elem típusa" #: src/Gui/Widgets/Editors/ItemEditor.cs:111 src/Gui/Widgets/ItemInfo.cs:371 msgid "Note" msgstr "Megjegyzés" #: src/Gui/Widgets/Editors/ItemEditor.cs:112 src/Gui/Widgets/ItemInfo.cs:374 msgid "Keywords" msgstr "Kulcsszavak" #: src/Gui/Widgets/Editors/AudioTrackItemEditor.cs:31 #: src/Gui/Widgets/SearchResultView.cs:34 msgid "Audio CD track" msgstr "Audió CD sáv" #: src/Gui/Widgets/Editors/AudioTrackItemEditor.cs:54 #: src/Gui/Widgets/ItemInfo.cs:230 msgid "Type" msgstr "Típus" #: src/Gui/Widgets/Editors/DirectoryItemEditor.cs:28 msgid "Directory" msgstr "Könyvtár" #: src/Gui/Widgets/Editors/FileSystemItemEditor.cs:59 #: src/Gui/Widgets/SearchResultView.cs:31 src/Gui/Widgets/ItemInfo.cs:183 msgid "Location" msgstr "Hely" #: src/Gui/Widgets/Editors/FileSystemItemEditor.cs:60 #: src/Gui/Widgets/ItemInfo.cs:185 msgid "Last write time" msgstr "Utolsó írás ideje" #: src/Gui/Widgets/Editors/FileSystemItemEditor.cs:61 #: src/Gui/Widgets/ItemInfo.cs:210 msgid "Filetype" msgstr "Fájltípus" #: src/Gui/Widgets/Editors/FileItemEditor.cs:31 msgid "File" msgstr "Fájl" #: src/Gui/Widgets/Editors/FileItemEditor.cs:52 #: src/Gui/Widgets/ItemInfo.cs:204 src/Gui/Widgets/ItemInfo.cs:226 #: src/Gui/DriveSelection.cs:148 msgid "Size" msgstr "Méret" #: src/Gui/Widgets/Editors/FileItemEditor.cs:53 #: src/Gui/Widgets/ItemInfo.cs:206 msgid "Hash" msgstr "Hash" #: src/Gui/Widgets/Editors/AudioCdVolumeEditor.cs:33 msgid "Audio CD" msgstr "Audió CD" #: src/Gui/Widgets/Editors/AudioCdVolumeEditor.cs:63 msgid "Tracks:" msgstr "Számok:" #: src/Gui/Widgets/Editors/AudioCdVolumeEditor.cs:64 msgid "Duration:" msgstr "Hossz:" #: src/Gui/Widgets/Editors/VolumeEditor.cs:45 msgid "Backup" msgstr "Biztonsági mentés" #: src/Gui/Widgets/Editors/VolumeEditor.cs:46 #: src/Gui/Widgets/CategoryView.cs:60 msgid "Documents" msgstr "Dokumentumok" #: src/Gui/Widgets/Editors/VolumeEditor.cs:47 #: src/Gui/Widgets/CategoryView.cs:61 msgid "Music" msgstr "Zene" #: src/Gui/Widgets/Editors/VolumeEditor.cs:48 msgid "Audiobooks" msgstr "Hangoskönyvek" #: src/Gui/Widgets/Editors/VolumeEditor.cs:49 #: src/Gui/Widgets/CategoryView.cs:62 msgid "Movies" msgstr "Filmek" #: src/Gui/Widgets/Editors/VolumeEditor.cs:50 msgid "Videos" msgstr "Videók" #: src/Gui/Widgets/Editors/VolumeEditor.cs:51 msgid "Pictures" msgstr "Képek" #: src/Gui/Widgets/Editors/VolumeEditor.cs:52 msgid "Games" msgstr "Játékok" #: src/Gui/Widgets/Editors/VolumeEditor.cs:53 src/Gui/Widgets/ItemInfo.cs:319 msgid "Software" msgstr "Szoftver" #: src/Gui/Widgets/Editors/VolumeEditor.cs:54 msgid "Misc" msgstr "Különféle" #: src/Gui/Widgets/Editors/VolumeEditor.cs:55 msgid "Other" msgstr "Egyéb" #: src/Gui/Widgets/Editors/VolumeEditor.cs:225 msgid "Yes" msgstr "Igen" #: src/Gui/Widgets/Editors/VolumeEditor.cs:225 msgid "No" msgstr "Nem" #: src/Gui/Widgets/Editors/VolumeEditor.cs:235 msgid "Volume type:" msgstr "Kötet típusa:" #: src/Gui/Widgets/Editors/VolumeEditor.cs:236 msgid "Hashed:" msgstr "Hash:" #: src/Gui/Widgets/Editors/VolumeEditor.cs:237 msgid "Added:" msgstr "Hozzáadva:" #: src/Gui/Widgets/Editors/VolumeEditor.cs:258 msgid "Archive No.:" msgstr "Archívum szám:" #: src/Gui/Widgets/Editors/VolumeEditor.cs:260 msgid "Title:" msgstr "Cím:" #: src/Gui/Widgets/Editors/VolumeEditor.cs:261 src/Gui/DBProperties.cs:98 msgid "Description:" msgstr "Leírás:" #: src/Gui/Widgets/Editors/VolumeEditor.cs:262 msgid "Keywords:" msgstr "Kulcsszavak:" #: src/Gui/Widgets/Editors/VolumeEditor.cs:263 msgid "Loaned to:" msgstr "Kölcsönadva:" #: src/Gui/Widgets/Editors/VolumeEditor.cs:264 msgid "Loaned date:" msgstr "Kölcsönadás dátuma:" #: src/Gui/Widgets/Editors/VolumeEditor.cs:265 msgid "Return date:" msgstr "Visszahozás dátuma" #: src/Gui/Widgets/CategoryView.cs:58 msgid "Directories" msgstr "Könyvtárak" #: src/Gui/Widgets/CategoryView.cs:59 msgid "Text" msgstr "Szöveg" #: src/Gui/Widgets/CategoryView.cs:63 msgid "Images" msgstr "Képek" #: src/Gui/Widgets/CategoryView.cs:64 msgid "Applications" msgstr "Alkalmazások" #: src/Gui/Widgets/CategoryView.cs:65 msgid "Archives" msgstr "Archívumok" #: src/Gui/Widgets/CategoryView.cs:66 msgid "Development" msgstr "Fejlesztés" #: src/Gui/Widgets/CategoryView.cs:96 src/Gui/MainWindow.cs:1046 msgid "Category" msgstr "Kategória" #: src/Gui/Widgets/CategoryView.cs:128 msgid "All items" msgstr "Minden elem" #: src/Gui/Widgets/SearchResultView.cs:32 msgid "Volume" msgstr "Kötet" #: src/Gui/Widgets/SearchResultView.cs:33 src/Gui/MainWindow.cs:1040 msgid "Archive No." msgstr "Archívum szám." #: src/Gui/Widgets/ItemInfo.cs:40 msgid "by" msgstr "ezzel:" #: src/Gui/Widgets/ItemInfo.cs:41 msgid "from" msgstr "innen:" #: src/Gui/Widgets/ItemInfo.cs:196 msgid "Symlink target" msgstr "Szimbolikus link cél" #: src/Gui/Widgets/ItemInfo.cs:227 msgid "Track No." msgstr "Szám" #: src/Gui/Widgets/ItemInfo.cs:258 msgid "Genre" msgstr "Műfaj" #: src/Gui/Widgets/ItemInfo.cs:278 msgid "Year" msgstr "Év" #: src/Gui/Widgets/ItemInfo.cs:283 msgid "Description" msgstr "Leírás" #: src/Gui/Widgets/ItemInfo.cs:294 msgid "Dimensions" msgstr "Méretek" #: src/Gui/Widgets/ItemInfo.cs:299 msgid "Format" msgstr "Formátum" #: src/Gui/Widgets/ItemInfo.cs:303 msgid "Author" msgstr "Szerző" #: src/Gui/Widgets/ItemInfo.cs:307 msgid "Copyright" msgstr "Szerzői jog" #: src/Gui/Widgets/ItemInfo.cs:311 msgid "Producer" msgstr "Készítő" #: src/Gui/Widgets/ItemInfo.cs:315 msgid "Creator" msgstr "Létrehozó" #: src/Gui/Widgets/ItemInfo.cs:323 msgid "Language" msgstr "Nyelv" #: src/Gui/Widgets/ItemInfo.cs:327 msgid "Page count" msgstr "Lap szám" #: src/Gui/Widgets/ItemInfo.cs:346 msgid "File count" msgstr "Fájl szám" #: src/Gui/Widgets/PageNavigation.cs:27 msgid "No items." msgstr "Nincs elem" #: src/Gui/Widgets/PageNavigation.cs:145 #, csharp-format msgid "Page {0}/{1} ({2} - {3} of {4} items)" msgstr "Lap {0}/{1} ({2} - {3} / {4} elem)" #: src/Gui/ObjectProperties.cs:54 src/Gui/VolumeScanner.cs:248 msgid "Invalid data" msgstr "Érvénytelen adat" #: src/Gui/ObjectProperties.cs:54 src/Gui/VolumeScanner.cs:249 #, csharp-format msgid "" "\"{0}\" is {1}.\n" "\n" "Expected format: {2}\n" "Please correct or remove the data you entered." msgstr "" "A \"{0} a következő: {1}.\n" "A kívánt formátum pedig: {2}\n" "Korrigálja, vagy távolítsa el a helytelen adatot." #: src/Gui/DBProperties.cs:85 msgid "Database Properties" msgstr "Adatbázis tulajdonságok" #: src/Gui/DBProperties.cs:97 msgid "Name:" msgstr "Név:" #: src/Gui/DBProperties.cs:99 msgid "Created:" msgstr "Létrehozva:" #: src/Gui/VolumeProperties.cs:29 msgid "Volume Properties" msgstr "Kötet tulajdonságai" #: src/Gui/DriveSelection.cs:60 msgid "Waiting for drives..." msgstr "Várakozás az eszközre..." #: src/Gui/DriveSelection.cs:133 msgid "Drive" msgstr "Meghajtó" #: src/Gui/DriveSelection.cs:139 msgid "Label" msgstr "Címke" #: src/Gui/DriveSelection.cs:241 msgid "Please select a drive to scan" msgstr "Kérem válasszon meghajtót a vizsgálathoz" #: src/Gui/About.cs:28 msgid "A cross-platform media indexing/search tool." msgstr "" #: src/Gui/About.cs:29 #, csharp-format msgid "Using VolumeDB v{0}." msgstr "VolumeDB v{0} használatával." #: src/Gui/About.cs:31 msgid "Copyright (c) " msgstr "Minden jog fenntartva (c) " #: src/Gui/ItemSearch.cs:81 #, csharp-format msgid "Found {0} items in {1:F3} seconds." msgstr "{0} elem található, {1:F3} másodpercen belül." #: src/Gui/ItemSearch.cs:92 src/Gui/MainWindow.cs:519 msgid "Timeout: another search is probably still in progress." msgstr "Időtúllépés: másik keresés még valószínűleg folyamatban van." #: src/Gui/ItemSearch.cs:94 msgid "Too many search results. Please refine your search criteria." msgstr "Túl sok találat. Kérem finomítsa a keresési kritériumokat." #: src/Gui/ItemSearch.cs:112 src/Gui/MainWindow.cs:535 msgid "Searching..." msgstr "Keresés..." #: src/Gui/ItemSearch.cs:267 msgid "Search Items" msgstr "Elemek keresése" #: src/Gui/ItemSearch.cs:279 src/Gui/MainWindow.cs:1145 msgid "default" msgstr "alapértelmezett" #: src/Gui/ItemSearch.cs:283 msgid "Search items" msgstr "Elemek keresése" #: src/Gui/ItemSearch.cs:318 msgid "Quick tip:" msgstr "" #: src/Gui/ItemSearch.cs:319 #, csharp-format msgid "" "Click on the icon to the left of the search field to build advanced search " "queries.\n" "Example: {0}" msgstr "" #: src/Gui/ItemSearch.cs:326 msgid "No search results." msgstr "Nincs a keresésnek megfelelő találat." #: src/Gui/ItemSearch.cs:375 src/Gui/MainWindow.cs:1028 msgid "Edit Item" msgstr "Elem szerkesztése" #: src/Gui/ItemSearch.cs:382 msgid "Show in Main Window" msgstr "" #: src/Gui/MainWindow.cs:77 src/Gui/MainWindow.cs:93 src/Gui/MainWindow.cs:635 #, csharp-format msgid "Database '{0}' not found." msgstr "A következő adatbázis nem található: '{0}'." #: src/Gui/MainWindow.cs:185 msgid "Database not found" msgstr "Az adatbázis nem található" #: src/Gui/MainWindow.cs:186 msgid "Default database not found. Create?" msgstr "Az alapértelmezett adatbázis nem található. Létrehozzam?" #: src/Gui/MainWindow.cs:215 msgid "Unsupported database version" msgstr "Nem támogatott adatbázis verzió" #: src/Gui/MainWindow.cs:216 msgid "This database version is not supported." msgstr "Ez az adatbázis verzió nem támogatott" #: src/Gui/MainWindow.cs:235 #, csharp-format msgid "{0} volumes loaded." msgstr "{0} kötet betöltve." #: src/Gui/MainWindow.cs:256 #, csharp-format msgid "An error occured while loading the volume list: {0}" msgstr "Hiba történt a kötetlista betöltésekor: {0}" #: src/Gui/MainWindow.cs:300 msgid "Please enter the name for the new database" msgstr "Adja meg az új adatbázis nevét" #: src/Gui/MainWindow.cs:312 msgid "Database exists" msgstr "Az adatbázis már létezik" #: src/Gui/MainWindow.cs:313 msgid "Database already exists. Overwrite?" msgstr "Az adatbázis már létezik. Felülírjam?" #: src/Gui/MainWindow.cs:326 msgid "Please select a database" msgstr "Válasszon egy adatbázist" #: src/Gui/MainWindow.cs:335 src/Gui/Import.cs:83 msgid "Database not found." msgstr "Az adatbázis nem tlaálható." #: src/Gui/MainWindow.cs:356 #, csharp-format msgid "" "An error occured while accessing drive {0}:\n" "{1}" msgstr "" "Hiba történt a következő meghajtó elérésekor {0}:\n" "{1}" #: src/Gui/MainWindow.cs:378 #, csharp-format msgid "Drive {0} is not ready." msgstr "Az eszköz {0} nem áll készen." #: src/Gui/MainWindow.cs:387 #, csharp-format msgid "Drive {0} is neither mounted nor does it contain an audio cd." msgstr "A meghajtó {0} nem csatolható vagy nem audio cd." #: src/Gui/MainWindow.cs:406 msgid "Confirmation" msgstr "Megerősítés" #: src/Gui/MainWindow.cs:407 msgid "Are you sure you really want to remove the selected volume?" msgstr "Valóban törölni szeretné a kijelölt kötetet?" #: src/Gui/MainWindow.cs:712 #, csharp-format msgid "Please insert volume '{0}'." msgstr "" #: src/Gui/MainWindow.cs:714 msgid "Waiting for volume" msgstr "" #: src/Gui/MainWindow.cs:966 msgid "Add Volume" msgstr "" #: src/Gui/MainWindow.cs:970 msgid "Search" msgstr "" #: src/Gui/MainWindow.cs:973 msgid "App Menu" msgstr "" #: src/Gui/MainWindow.cs:979 msgid "_New Database" msgstr "Új _adatbázis" #: src/Gui/MainWindow.cs:982 msgid "_Open Database" msgstr "Adatbázis _megnyitása" #: src/Gui/MainWindow.cs:985 msgid "Open Default Database" msgstr "Alapértelmezett adatbázis megnyitása" #: src/Gui/MainWindow.cs:991 msgid "Recent Databases" msgstr "Előzőleg használt adatbázisok" #: src/Gui/MainWindow.cs:998 msgid "_Import" msgstr "_Importálás" #: src/Gui/MainWindow.cs:1001 msgid "_Preferences" msgstr "_Beállítások" #: src/Gui/MainWindow.cs:1004 msgid "_Database Properties" msgstr "A_datbázis tulajdonságai" #: src/Gui/MainWindow.cs:1007 msgid "Info" msgstr "" #: src/Gui/MainWindow.cs:1010 msgid "_Quit" msgstr "_Kilépés" #: src/Gui/MainWindow.cs:1016 msgid "_Edit Volume" msgstr "Kötet sz_erkesztése" #: src/Gui/MainWindow.cs:1019 msgid "_Remove Volume" msgstr "Kötet el_távolítása" #: src/Gui/MainWindow.cs:1022 msgid "Rescan Volume" msgstr "" #: src/Gui/MainWindow.cs:1034 msgid "Sort by" msgstr "Rendezés" #: src/Gui/MainWindow.cs:1037 msgid "Descending" msgstr "Csökkenő" #: src/Gui/MainWindow.cs:1043 msgid "Date added" msgstr "Hozzáadás dátuma" #: src/Gui/MainWindow.cs:1044 msgid "Title" msgstr "Cím" #: src/Gui/MainWindow.cs:1045 msgid "Drivetype" msgstr "Eszköz típus" #: src/Gui/MainWindow.cs:1142 msgid "Filter volumes" msgstr "Kötetek szűrése" #: src/Gui/Import.cs:29 msgid "Import" msgstr "Importálás" #: src/Gui/Import.cs:30 msgid "Abort" msgstr "Megszakít" #: src/Gui/Import.cs:31 msgid "Please select a database." msgstr "" #: src/Gui/Import.cs:72 #, csharp-format msgid "{0:0}% completed." msgstr "{0:0}% kész" #: src/Gui/Import.cs:82 msgid "Import failed" msgstr "Az importálás sikertelen volt" #: src/Gui/Import.cs:85 msgid "Import failed!" msgstr "Az importálás nem sikerült!" #: src/Gui/Import.cs:87 msgid "Import aborted." msgstr "Importálás megszakítva." #: src/Gui/Import.cs:89 msgid "Import completed successfully." msgstr "Az importálás sikeres." #: src/Gui/Import.cs:121 msgid "Import in progress" msgstr "Importálás folyamatban" #: src/Gui/Import.cs:122 msgid "You must stop the import before closing this window." msgstr "Le kell állítania az importálást, mielőtt bezárja ezt az ablakot." #: src/Gui/Import.cs:148 msgid "Unknown format." msgstr "" #: src/Gui/Import.cs:175 msgid "Import Database" msgstr "Adatbázis importálása" #: src/Gui/Import.cs:186 msgid "Please select a database to import" msgstr "Válasszon egy adatbázist az importáshoz" #: src/Gui/Import.cs:194 msgid "All supported formats" msgstr "" #: src/Gui/Import.cs:198 #, csharp-format msgid ".{0} files" msgstr "" #: src/Gui/Import.cs:209 msgid "Database:" msgstr "Adatbázis:" #: src/Gui/Import.cs:210 msgid "Format:" msgstr "Formátum:" #: src/Gui/ItemProperties.cs:29 msgid "Item Properties" msgstr "Elem tulajdonságok" #: src/Gui/VolumeScanner.cs:116 msgid "Scanning started." msgstr "Vizsgálat elindult." #: src/Gui/VolumeScanner.cs:118 #, csharp-format msgid "Scanning of drive '{0}' started." msgstr "A következő meghajtó beolvasása megkezdődött: '{0}'." #: src/Gui/VolumeScanner.cs:124 #, csharp-format msgid "" "Options: generate thumbs: {0}, extract metadata: {1}, discard symlinks: {2}, " "hashing: {3}." msgstr "" "Opciók: kisképek generálása: {0}, meta információk kinyerése: {1}, " "szimbólikus linkek figyelmen kívül hagyása {2}, ellenőrzőösszeg használata " "{3}." #: src/Gui/VolumeScanner.cs:131 #, csharp-format msgid "Options: MusicBrainz enabled: {0}" msgstr "Opciók: MusicBrainz engedélyezve: {0}" #: src/Gui/VolumeScanner.cs:157 msgid "Time" msgstr "Idő" #: src/Gui/VolumeScanner.cs:161 msgid "Message" msgstr "Üzenet" #: src/Gui/VolumeScanner.cs:258 msgid "Stopping Scanner and performing rollback..." msgstr "Átvizsgálás megállítása és visszatérés ..." #: src/Gui/VolumeScanner.cs:268 msgid "yes" msgstr "igen" #: src/Gui/VolumeScanner.cs:268 msgid "no" msgstr "nem" #: src/Gui/VolumeScanner.cs:291 msgid "Scan in progress" msgstr "Átvizsgálás folyamatban" #: src/Gui/VolumeScanner.cs:291 msgid "You must stop scanning before closing this window." msgstr "" "Meg kell szakítania az átvizsgálást ahhoz hogy becsukja azt az ablakot" #: src/Gui/VolumeScanner.cs:346 #, csharp-format msgid "An unhandled exception occured ({0})." msgstr "Váratlan hiba történt ({0})." #: src/Gui/VolumeScanner.cs:347 msgid "All database changes have been rolled back." msgstr "Az adatbázis változások visszaállításra kerültek." #: src/Gui/VolumeScanner.cs:354 #, csharp-format msgid "Scanning failed. Reason: an unhandled exception occured ({0})." msgstr "Az átvizsgálás nem sikerült. Ok: váratlan hiba történt ({0})." #: src/Gui/VolumeScanner.cs:356 msgid "Scanning aborted." msgstr "Átvizsgálás megszakítva." #: src/Gui/VolumeScanner.cs:358 msgid "Scanning completed successfully." msgstr "Az átvizsgálás sikeresen befejeződött." #: src/Gui/VolumeScanner.cs:488 msgid "VolumeScanner" msgstr "KötetVizsgáló" #: src/Gui/VolumeScanner.cs:500 msgid "Volume Information:" msgstr "Kötet információ:" #: src/Gui/VolumeScanner.cs:510 msgid "Scanner Log:" msgstr "Átvizsgálás log:" #: src/Gui/VolumeScanner.cs:527 msgid "Database access" msgstr "Adatbázis elérés" #: src/Gui/Preferences.cs:119 msgid "None" msgstr "Nincs" #: src/Gui/Preferences.cs:228 msgid "Unsupported theme" msgstr "Nem támogatott téma" #: src/Gui/Preferences.cs:229 msgid "The selected icon theme is currently not supported on your system." msgstr "A kiválaszott ikon téma jelenleg nem támogatott az Ön rendszerén." #: src/Gui/Preferences.cs:267 msgid "Restart required" msgstr "Újraindítás szükséges" #: src/Gui/Preferences.cs:268 #, csharp-format msgid "You must restart {0} for icontheme changes to take effect." msgstr "" "Újraindítás szükséges, hogy az új ikontéma {0} változásai érvényre jussanak." #: src/Gui/Preferences.cs:298 msgid "Preferences" msgstr "Beállítások" #: src/Gui/Preferences.cs:322 msgid "_Load Defaults" msgstr "A_lapértelmezések betöltése" #: src/Gui/Preferences.cs:349 msgid "Icon theme:" msgstr "Ikontéma:" #: src/Gui/Preferences.cs:355 msgid "Reopen most recent database on startup" msgstr "A legutóbb használt adatbázis megnyitása a program indításakor" #: src/Gui/Preferences.cs:359 msgid "Show iteminfo panel" msgstr "" #: src/Gui/Preferences.cs:363 msgid "Show hidden files" msgstr "" #: src/Gui/Preferences.cs:367 msgid "Show thumbnails in the filebrowser" msgstr "Előnézeti képek mutatása a fájlböngészőben" #: src/Gui/Preferences.cs:370 msgid "General" msgstr "Általános" #: src/Gui/Preferences.cs:378 msgid "Don't prompt, always scan:" msgstr "Nincs kérdés, mindig keres:" #: src/Gui/Preferences.cs:397 msgid "Generate Thumbnails" msgstr "Előnézeti képek létrehozása" #: src/Gui/Preferences.cs:401 msgid "Extract metadata" msgstr "Metaadatok kibontása" #: src/Gui/Preferences.cs:405 msgid "Discard symbolic links" msgstr "Szimbolikus linkek eldobása" #: src/Gui/Preferences.cs:409 msgid "Compute hashcodes for files (slow!)" msgstr "Hash kódok számolása a fájlokhoz (lassú!)" #: src/Gui/Preferences.cs:413 msgid "Fetch audio cd metadata from MusicBrainz.org" msgstr "Audió CD metaadat lekérése a MusicBrainz.org szerverről" #: src/Gui/Preferences.cs:416 msgid "Scanner" msgstr "Kereső" Basenji/po/uk.po0000664000175000017500000005757112067326706013734 0ustar patrickpatrick# Ukrainian translation for basenji # Copyright (c) 2010 Rosetta Contributors and Canonical Ltd 2010 # This file is distributed under the same license as the basenji package. # FIRST AUTHOR , 2010. # msgid "" msgstr "" "Project-Id-Version: basenji\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2012-07-15 15:49+0200\n" "PO-Revision-Date: 2011-02-05 12:11+0000\n" "Last-Translator: Wladimir Rossinski \n" "Language-Team: Ukrainian \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2012-10-27 11:00+0000\n" "X-Generator: Launchpad (build 16194)\n" #: src/Util.cs:30 #, csharp-format msgid "{0} Bytes" msgstr "{0} Байтів" #: src/Util.cs:32 msgid "Bytes" msgstr "Байтів" #: src/Util.cs:32 msgid "KB" msgstr "Kб" #: src/Util.cs:32 msgid "MB" msgstr "Мб" #: src/Util.cs:32 msgid "GB" msgstr "Гб" #: src/Util.cs:32 msgid "TB" msgstr "Tб" #: src/Options.cs:477 msgid "OptionName" msgstr "Назва опції" #: src/FileDialog.cs:51 msgid "VolumeDatabase files" msgstr "Файли бази данних" #: src/FileDialog.cs:56 msgid "All files" msgstr "Усі файли" #: src/Main.cs:142 src/Gui/MainWindow.cs:76 src/Gui/MainWindow.cs:92 #: src/Gui/MainWindow.cs:334 src/Gui/MainWindow.cs:355 #: src/Gui/MainWindow.cs:377 src/Gui/MainWindow.cs:386 #: src/Gui/MainWindow.cs:635 msgid "Error" msgstr "Помилка" #: src/Main.cs:142 #, csharp-format msgid "{0} is already running." msgstr "{0} вже запущено." #: src/Gui/Widgets/VolumeView.cs:42 src/Gui/Widgets/SearchResultView.cs:30 msgid "Unnamed" msgstr "Без назви" #: src/Gui/Widgets/VolumeView.cs:43 #: src/Gui/Widgets/Editors/VolumeEditor.cs:259 msgid "Category:" msgstr "Категорія:" #: src/Gui/Widgets/VolumeView.cs:44 msgid "files" msgstr "файли" #: src/Gui/Widgets/VolumeView.cs:45 msgid "tracks" msgstr "композиції" #: src/Gui/Widgets/ItemView.cs:29 msgid "Loading..." msgstr "Завантаження..." #: src/Gui/Widgets/ItemView.cs:30 msgid "(empty)" msgstr "(порожньо)" #: src/Gui/Widgets/ItemView.cs:99 src/Gui/DriveSelection.cs:80 msgid "Unknown" msgstr "Невідомий" #: src/Gui/Widgets/ItemView.cs:170 src/Gui/Widgets/Editors/ItemEditor.cs:96 msgid "Name" msgstr "Назва" #: src/Gui/Widgets/ItemView.cs:176 msgid "Artist" msgstr "Виконавець" #: src/Gui/Widgets/ItemView.cs:181 #: src/Gui/Widgets/Editors/AudioTrackItemEditor.cs:53 #: src/Gui/Widgets/ItemInfo.cs:225 src/Gui/Widgets/ItemInfo.cs:288 msgid "Duration" msgstr "Тривалість" #: src/Gui/Widgets/Editors/FileSystemVolumeEditor.cs:34 #: src/Gui/DriveSelection.cs:168 msgid "Filesystem" msgstr "Файлова система" #: src/Gui/Widgets/Editors/FileSystemVolumeEditor.cs:65 msgid "Files:" msgstr "Файли:" #: src/Gui/Widgets/Editors/FileSystemVolumeEditor.cs:66 msgid "Directories:" msgstr "Теки:" #: src/Gui/Widgets/Editors/FileSystemVolumeEditor.cs:67 msgid "Total size:" msgstr "Загальний розмір:" #: src/Gui/Widgets/Editors/ItemEditor.cs:95 msgid "Item type" msgstr "Тип" #: src/Gui/Widgets/Editors/ItemEditor.cs:111 src/Gui/Widgets/ItemInfo.cs:371 msgid "Note" msgstr "Примітка" #: src/Gui/Widgets/Editors/ItemEditor.cs:112 src/Gui/Widgets/ItemInfo.cs:374 msgid "Keywords" msgstr "Ключові слова" #: src/Gui/Widgets/Editors/AudioTrackItemEditor.cs:31 #: src/Gui/Widgets/SearchResultView.cs:34 msgid "Audio CD track" msgstr "Трек аудіо CD" #: src/Gui/Widgets/Editors/AudioTrackItemEditor.cs:54 #: src/Gui/Widgets/ItemInfo.cs:230 msgid "Type" msgstr "Тип" #: src/Gui/Widgets/Editors/DirectoryItemEditor.cs:28 msgid "Directory" msgstr "Тека" #: src/Gui/Widgets/Editors/FileSystemItemEditor.cs:59 #: src/Gui/Widgets/SearchResultView.cs:31 src/Gui/Widgets/ItemInfo.cs:183 msgid "Location" msgstr "Розташування" #: src/Gui/Widgets/Editors/FileSystemItemEditor.cs:60 #: src/Gui/Widgets/ItemInfo.cs:185 msgid "Last write time" msgstr "Час останнього запису" #: src/Gui/Widgets/Editors/FileSystemItemEditor.cs:61 #: src/Gui/Widgets/ItemInfo.cs:210 msgid "Filetype" msgstr "Тип файла" #: src/Gui/Widgets/Editors/FileItemEditor.cs:31 msgid "File" msgstr "Файл" #: src/Gui/Widgets/Editors/FileItemEditor.cs:52 #: src/Gui/Widgets/ItemInfo.cs:204 src/Gui/Widgets/ItemInfo.cs:226 #: src/Gui/DriveSelection.cs:148 msgid "Size" msgstr "Розмір" #: src/Gui/Widgets/Editors/FileItemEditor.cs:53 #: src/Gui/Widgets/ItemInfo.cs:206 msgid "Hash" msgstr "Хеш" #: src/Gui/Widgets/Editors/AudioCdVolumeEditor.cs:33 msgid "Audio CD" msgstr "Аудіо CD" #: src/Gui/Widgets/Editors/AudioCdVolumeEditor.cs:63 msgid "Tracks:" msgstr "Доріжки:" #: src/Gui/Widgets/Editors/AudioCdVolumeEditor.cs:64 msgid "Duration:" msgstr "Тривалість:" #: src/Gui/Widgets/Editors/VolumeEditor.cs:45 msgid "Backup" msgstr "Резервна копія" #: src/Gui/Widgets/Editors/VolumeEditor.cs:46 #: src/Gui/Widgets/CategoryView.cs:60 msgid "Documents" msgstr "Документи" #: src/Gui/Widgets/Editors/VolumeEditor.cs:47 #: src/Gui/Widgets/CategoryView.cs:61 msgid "Music" msgstr "Музика" #: src/Gui/Widgets/Editors/VolumeEditor.cs:48 msgid "Audiobooks" msgstr "Аудіокниги" #: src/Gui/Widgets/Editors/VolumeEditor.cs:49 #: src/Gui/Widgets/CategoryView.cs:62 msgid "Movies" msgstr "Фільми" #: src/Gui/Widgets/Editors/VolumeEditor.cs:50 msgid "Videos" msgstr "Відео" #: src/Gui/Widgets/Editors/VolumeEditor.cs:51 msgid "Pictures" msgstr "Картинки" #: src/Gui/Widgets/Editors/VolumeEditor.cs:52 msgid "Games" msgstr "Ігри" #: src/Gui/Widgets/Editors/VolumeEditor.cs:53 src/Gui/Widgets/ItemInfo.cs:319 msgid "Software" msgstr "Програми" #: src/Gui/Widgets/Editors/VolumeEditor.cs:54 msgid "Misc" msgstr "Різне" #: src/Gui/Widgets/Editors/VolumeEditor.cs:55 msgid "Other" msgstr "Інше" #: src/Gui/Widgets/Editors/VolumeEditor.cs:225 msgid "Yes" msgstr "Так" #: src/Gui/Widgets/Editors/VolumeEditor.cs:225 msgid "No" msgstr "Ні" #: src/Gui/Widgets/Editors/VolumeEditor.cs:235 msgid "Volume type:" msgstr "Тип носія:" #: src/Gui/Widgets/Editors/VolumeEditor.cs:236 msgid "Hashed:" msgstr "Хеширування:" #: src/Gui/Widgets/Editors/VolumeEditor.cs:237 msgid "Added:" msgstr "Додано:" #: src/Gui/Widgets/Editors/VolumeEditor.cs:258 msgid "Archive No.:" msgstr "Том №:" #: src/Gui/Widgets/Editors/VolumeEditor.cs:260 msgid "Title:" msgstr "Заголовок:" #: src/Gui/Widgets/Editors/VolumeEditor.cs:261 src/Gui/DBProperties.cs:98 msgid "Description:" msgstr "Опис:" #: src/Gui/Widgets/Editors/VolumeEditor.cs:262 msgid "Keywords:" msgstr "Ключові слова:" #: src/Gui/Widgets/Editors/VolumeEditor.cs:263 msgid "Loaned to:" msgstr "Кому позичено:" #: src/Gui/Widgets/Editors/VolumeEditor.cs:264 msgid "Loaned date:" msgstr "Коли позичено:" #: src/Gui/Widgets/Editors/VolumeEditor.cs:265 msgid "Return date:" msgstr "Має повернути:" #: src/Gui/Widgets/CategoryView.cs:58 msgid "Directories" msgstr "Теки:" #: src/Gui/Widgets/CategoryView.cs:59 msgid "Text" msgstr "Текст" #: src/Gui/Widgets/CategoryView.cs:63 msgid "Images" msgstr "Картинки" #: src/Gui/Widgets/CategoryView.cs:64 msgid "Applications" msgstr "Програми" #: src/Gui/Widgets/CategoryView.cs:65 msgid "Archives" msgstr "Архіви" #: src/Gui/Widgets/CategoryView.cs:66 msgid "Development" msgstr "Розробка" #: src/Gui/Widgets/CategoryView.cs:96 src/Gui/MainWindow.cs:1046 msgid "Category" msgstr "Категорія" #: src/Gui/Widgets/CategoryView.cs:128 msgid "All items" msgstr "Всі елементи" #: src/Gui/Widgets/SearchResultView.cs:32 msgid "Volume" msgstr "Том" #: src/Gui/Widgets/SearchResultView.cs:33 src/Gui/MainWindow.cs:1040 msgid "Archive No." msgstr "Архів №." #: src/Gui/Widgets/ItemInfo.cs:40 msgid "by" msgstr "від" #: src/Gui/Widgets/ItemInfo.cs:41 msgid "from" msgstr "з" #: src/Gui/Widgets/ItemInfo.cs:196 msgid "Symlink target" msgstr "Об'єкт символьного посилання" #: src/Gui/Widgets/ItemInfo.cs:227 msgid "Track No." msgstr "Трек №." #: src/Gui/Widgets/ItemInfo.cs:258 msgid "Genre" msgstr "Жанр" #: src/Gui/Widgets/ItemInfo.cs:278 msgid "Year" msgstr "Рік" #: src/Gui/Widgets/ItemInfo.cs:283 msgid "Description" msgstr "Опис" #: src/Gui/Widgets/ItemInfo.cs:294 msgid "Dimensions" msgstr "Розміри" #: src/Gui/Widgets/ItemInfo.cs:299 msgid "Format" msgstr "Формат" #: src/Gui/Widgets/ItemInfo.cs:303 msgid "Author" msgstr "Автор" #: src/Gui/Widgets/ItemInfo.cs:307 msgid "Copyright" msgstr "Копірайт" #: src/Gui/Widgets/ItemInfo.cs:311 msgid "Producer" msgstr "Виробник" #: src/Gui/Widgets/ItemInfo.cs:315 msgid "Creator" msgstr "Автор" #: src/Gui/Widgets/ItemInfo.cs:323 msgid "Language" msgstr "Мова" #: src/Gui/Widgets/ItemInfo.cs:327 msgid "Page count" msgstr "Кількість сторінок" #: src/Gui/Widgets/ItemInfo.cs:346 msgid "File count" msgstr "Кількість файлів" #: src/Gui/Widgets/PageNavigation.cs:27 msgid "No items." msgstr "Елементи відсутні" #: src/Gui/Widgets/PageNavigation.cs:145 #, csharp-format msgid "Page {0}/{1} ({2} - {3} of {4} items)" msgstr " Сторінка {0}/{1} ({2} - {3} з {4} елементів)" #: src/Gui/ObjectProperties.cs:54 src/Gui/VolumeScanner.cs:248 msgid "Invalid data" msgstr "Помилкові дані" #: src/Gui/ObjectProperties.cs:54 src/Gui/VolumeScanner.cs:249 #, csharp-format msgid "" "\"{0}\" is {1}.\n" "\n" "Expected format: {2}\n" "Please correct or remove the data you entered." msgstr "" "\"{0}\" - {1}.\n" "\n" "Очікуваний формат: {2}\n" "Будь ласка, виправте або вилучіть введені дані." #: src/Gui/DBProperties.cs:85 msgid "Database Properties" msgstr "Властивості бази даних" #: src/Gui/DBProperties.cs:97 msgid "Name:" msgstr "Назва:" #: src/Gui/DBProperties.cs:99 msgid "Created:" msgstr "Створено:" #: src/Gui/VolumeProperties.cs:29 msgid "Volume Properties" msgstr "Властивості тому" #: src/Gui/DriveSelection.cs:60 msgid "Waiting for drives..." msgstr "Очікування пристроїв..." #: src/Gui/DriveSelection.cs:133 msgid "Drive" msgstr "Пристрій" #: src/Gui/DriveSelection.cs:139 msgid "Label" msgstr "Мітка" #: src/Gui/DriveSelection.cs:241 msgid "Please select a drive to scan" msgstr "Будь ласка, виберіть диск для сканування" #: src/Gui/About.cs:28 msgid "A cross-platform media indexing/search tool." msgstr "" #: src/Gui/About.cs:29 #, csharp-format msgid "Using VolumeDB v{0}." msgstr "Використовується VolumeDB v{0}." #: src/Gui/About.cs:31 msgid "Copyright (c) " msgstr "Авторські права (c) " #: src/Gui/ItemSearch.cs:81 #, csharp-format msgid "Found {0} items in {1:F3} seconds." msgstr "Знайдено {0} об'єктів за {1:F3} секунд." #: src/Gui/ItemSearch.cs:92 src/Gui/MainWindow.cs:519 msgid "Timeout: another search is probably still in progress." msgstr "" "Перевищення ліміту часу: можливо, ще один пошук все ще продовжується." #: src/Gui/ItemSearch.cs:94 msgid "Too many search results. Please refine your search criteria." msgstr "" "Досить значна кількість результатів пошуку. Будь ласка, змініть критерії " "пошуку." #: src/Gui/ItemSearch.cs:112 src/Gui/MainWindow.cs:535 msgid "Searching..." msgstr "Триває пошук..." #: src/Gui/ItemSearch.cs:267 msgid "Search Items" msgstr "Пошук об'єктів" #: src/Gui/ItemSearch.cs:279 src/Gui/MainWindow.cs:1145 msgid "default" msgstr "за замовчуванням" #: src/Gui/ItemSearch.cs:283 msgid "Search items" msgstr "Пошук записів" #: src/Gui/ItemSearch.cs:318 msgid "Quick tip:" msgstr "" #: src/Gui/ItemSearch.cs:319 #, csharp-format msgid "" "Click on the icon to the left of the search field to build advanced search " "queries.\n" "Example: {0}" msgstr "" #: src/Gui/ItemSearch.cs:326 msgid "No search results." msgstr "Пошук нічого не дав." #: src/Gui/ItemSearch.cs:375 src/Gui/MainWindow.cs:1028 msgid "Edit Item" msgstr "Редагувати об'єкт" #: src/Gui/ItemSearch.cs:382 msgid "Show in Main Window" msgstr "" #: src/Gui/MainWindow.cs:77 src/Gui/MainWindow.cs:93 src/Gui/MainWindow.cs:635 #, csharp-format msgid "Database '{0}' not found." msgstr "База даних '{0}' не знайдена." #: src/Gui/MainWindow.cs:185 msgid "Database not found" msgstr "База даних не знайдена" #: src/Gui/MainWindow.cs:186 msgid "Default database not found. Create?" msgstr "База даних за замовчуванням не знайдена. Створити?" #: src/Gui/MainWindow.cs:215 msgid "Unsupported database version" msgstr "Версія бази даних не підтримується" #: src/Gui/MainWindow.cs:216 msgid "This database version is not supported." msgstr "Ця версія бази даних не підтримується." #: src/Gui/MainWindow.cs:235 #, csharp-format msgid "{0} volumes loaded." msgstr "{0} томів завантажено." #: src/Gui/MainWindow.cs:256 #, csharp-format msgid "An error occured while loading the volume list: {0}" msgstr "Виявлена помилка при завантаженні списку томів: {0}" #: src/Gui/MainWindow.cs:300 msgid "Please enter the name for the new database" msgstr "Будь ласка, введіть назву для нової бази даних" #: src/Gui/MainWindow.cs:312 msgid "Database exists" msgstr "База даних вже існує" #: src/Gui/MainWindow.cs:313 msgid "Database already exists. Overwrite?" msgstr "Така база даних вже існує. Перезаписати?" #: src/Gui/MainWindow.cs:326 msgid "Please select a database" msgstr "Будь ласка, виберіть базу даних" #: src/Gui/MainWindow.cs:335 src/Gui/Import.cs:83 msgid "Database not found." msgstr "База даних не знайдена." #: src/Gui/MainWindow.cs:356 #, csharp-format msgid "" "An error occured while accessing drive {0}:\n" "{1}" msgstr "" "Помилка з доступом до диску {0}:\n" "{1}" #: src/Gui/MainWindow.cs:378 #, csharp-format msgid "Drive {0} is not ready." msgstr "Диск {0} не готовий." #: src/Gui/MainWindow.cs:387 #, csharp-format msgid "Drive {0} is neither mounted nor does it contain an audio cd." msgstr "Диск {0} не під'єднаний та не містить звукових даних." #: src/Gui/MainWindow.cs:406 msgid "Confirmation" msgstr "Підтвердження" #: src/Gui/MainWindow.cs:407 msgid "Are you sure you really want to remove the selected volume?" msgstr "Ви дійсно бажаєте вилучити вибраний том?" #: src/Gui/MainWindow.cs:712 #, csharp-format msgid "Please insert volume '{0}'." msgstr "" #: src/Gui/MainWindow.cs:714 msgid "Waiting for volume" msgstr "" #: src/Gui/MainWindow.cs:966 msgid "Add Volume" msgstr "" #: src/Gui/MainWindow.cs:970 msgid "Search" msgstr "" #: src/Gui/MainWindow.cs:973 msgid "App Menu" msgstr "" #: src/Gui/MainWindow.cs:979 msgid "_New Database" msgstr "_Нова база даних" #: src/Gui/MainWindow.cs:982 msgid "_Open Database" msgstr "_Відкрити базу даних" #: src/Gui/MainWindow.cs:985 msgid "Open Default Database" msgstr "Відкрити основну базу даних" #: src/Gui/MainWindow.cs:991 msgid "Recent Databases" msgstr "Останні бази даних" #: src/Gui/MainWindow.cs:998 msgid "_Import" msgstr "_Імпортувати" #: src/Gui/MainWindow.cs:1001 msgid "_Preferences" msgstr "На_лаштування" #: src/Gui/MainWindow.cs:1004 msgid "_Database Properties" msgstr "Вла_стивості бази даних" #: src/Gui/MainWindow.cs:1007 msgid "Info" msgstr "" #: src/Gui/MainWindow.cs:1010 msgid "_Quit" msgstr "Ви_хід" #: src/Gui/MainWindow.cs:1016 msgid "_Edit Volume" msgstr "Вилу_чити том" #: src/Gui/MainWindow.cs:1019 msgid "_Remove Volume" msgstr "Вилучит_и том" #: src/Gui/MainWindow.cs:1022 msgid "Rescan Volume" msgstr "" #: src/Gui/MainWindow.cs:1034 msgid "Sort by" msgstr "Сортувати за" #: src/Gui/MainWindow.cs:1037 msgid "Descending" msgstr "За спаданням" #: src/Gui/MainWindow.cs:1043 msgid "Date added" msgstr "Додано" #: src/Gui/MainWindow.cs:1044 msgid "Title" msgstr "Заголовок" #: src/Gui/MainWindow.cs:1045 msgid "Drivetype" msgstr "Тип накопичувача" #: src/Gui/MainWindow.cs:1142 msgid "Filter volumes" msgstr "Фільтр томів" #: src/Gui/Import.cs:29 msgid "Import" msgstr "Імпортувати" #: src/Gui/Import.cs:30 msgid "Abort" msgstr "Скасувати" #: src/Gui/Import.cs:31 msgid "Please select a database." msgstr "" #: src/Gui/Import.cs:72 #, csharp-format msgid "{0:0}% completed." msgstr "{0:0}% завершено." #: src/Gui/Import.cs:82 msgid "Import failed" msgstr "Не вдалось імпортувати" #: src/Gui/Import.cs:85 msgid "Import failed!" msgstr "Не вдалось імпортувати!" #: src/Gui/Import.cs:87 msgid "Import aborted." msgstr "Імпортування скасовано." #: src/Gui/Import.cs:89 msgid "Import completed successfully." msgstr "Імпортування успішно завершено." #: src/Gui/Import.cs:121 msgid "Import in progress" msgstr "Триває імпортування" #: src/Gui/Import.cs:122 msgid "You must stop the import before closing this window." msgstr "Ви повинні зупинити імпортування перед тим, як закрити вікно." #: src/Gui/Import.cs:148 msgid "Unknown format." msgstr "" #: src/Gui/Import.cs:175 msgid "Import Database" msgstr "Імпортувати базу даних" #: src/Gui/Import.cs:186 msgid "Please select a database to import" msgstr "Будь ласка, виберіть базу даних для імпорту" #: src/Gui/Import.cs:194 msgid "All supported formats" msgstr "" #: src/Gui/Import.cs:198 #, csharp-format msgid ".{0} files" msgstr "" #: src/Gui/Import.cs:209 msgid "Database:" msgstr "База даних:" #: src/Gui/Import.cs:210 msgid "Format:" msgstr "Формат:" #: src/Gui/ItemProperties.cs:29 msgid "Item Properties" msgstr "Властивості об'єкта" #: src/Gui/VolumeScanner.cs:116 msgid "Scanning started." msgstr "Виконується сканування." #: src/Gui/VolumeScanner.cs:118 #, csharp-format msgid "Scanning of drive '{0}' started." msgstr "Виконується сканування диска '{0}'." #: src/Gui/VolumeScanner.cs:124 #, csharp-format msgid "" "Options: generate thumbs: {0}, extract metadata: {1}, discard symlinks: {2}, " "hashing: {3}." msgstr "" "Параметри: Попередній перегляд: {0}, Вилучення мета-даних: {1}, Без посилань " "на символи: {2}, Хеширувати: {3}." #: src/Gui/VolumeScanner.cs:131 #, csharp-format msgid "Options: MusicBrainz enabled: {0}" msgstr "Функції: MusicBrainz ввімкнено: {0}" #: src/Gui/VolumeScanner.cs:157 msgid "Time" msgstr "Час" #: src/Gui/VolumeScanner.cs:161 msgid "Message" msgstr "Повідомлення" #: src/Gui/VolumeScanner.cs:258 msgid "Stopping Scanner and performing rollback..." msgstr "Зупинка сканера та повернення на початкову позицію..." #: src/Gui/VolumeScanner.cs:268 msgid "yes" msgstr "так" #: src/Gui/VolumeScanner.cs:268 msgid "no" msgstr "ні" #: src/Gui/VolumeScanner.cs:291 msgid "Scan in progress" msgstr "Триває сканування" #: src/Gui/VolumeScanner.cs:291 msgid "You must stop scanning before closing this window." msgstr "Щоб закрити це вікно Ви повинні зупинити сканування." #: src/Gui/VolumeScanner.cs:346 #, csharp-format msgid "An unhandled exception occured ({0})." msgstr "Виникло необроблене виключення ({0})." #: src/Gui/VolumeScanner.cs:347 msgid "All database changes have been rolled back." msgstr "Всі зміни в базі даних скасовані." #: src/Gui/VolumeScanner.cs:354 #, csharp-format msgid "Scanning failed. Reason: an unhandled exception occured ({0})." msgstr "" "Не вдалось виконати сканування. Причина: необроблене виключення ({0})." #: src/Gui/VolumeScanner.cs:356 msgid "Scanning aborted." msgstr "Сканування скасоване." #: src/Gui/VolumeScanner.cs:358 msgid "Scanning completed successfully." msgstr "Сканування успішно завершено." #: src/Gui/VolumeScanner.cs:488 msgid "VolumeScanner" msgstr "Глибина сканування." #: src/Gui/VolumeScanner.cs:500 msgid "Volume Information:" msgstr "Інформація про звук:" #: src/Gui/VolumeScanner.cs:510 msgid "Scanner Log:" msgstr "Почерговий запис дій сканера:" #: src/Gui/VolumeScanner.cs:527 msgid "Database access" msgstr "Доступ до бази даних" #: src/Gui/Preferences.cs:119 msgid "None" msgstr "Відсутній" #: src/Gui/Preferences.cs:228 msgid "Unsupported theme" msgstr "Непідтримувана тема" #: src/Gui/Preferences.cs:229 msgid "The selected icon theme is currently not supported on your system." msgstr "" "Вибрана тема значків на даний момент не підтримується вашою системою." #: src/Gui/Preferences.cs:267 msgid "Restart required" msgstr "Необхідний перезапуск" #: src/Gui/Preferences.cs:268 #, csharp-format msgid "You must restart {0} for icontheme changes to take effect." msgstr "Ви повинні перезапустити {0} для застосування змін в темі значків." #: src/Gui/Preferences.cs:298 msgid "Preferences" msgstr "Налаштування" #: src/Gui/Preferences.cs:322 msgid "_Load Defaults" msgstr "Заванта_жити початкові параметри" #: src/Gui/Preferences.cs:349 msgid "Icon theme:" msgstr "Тема значків:" #: src/Gui/Preferences.cs:355 msgid "Reopen most recent database on startup" msgstr "Повторне відкриття останньої бази даних при запуску" #: src/Gui/Preferences.cs:359 msgid "Show iteminfo panel" msgstr "Показати панель \"iteminfo\"" #: src/Gui/Preferences.cs:363 msgid "Show hidden files" msgstr "Показувати приховані файли" #: src/Gui/Preferences.cs:367 msgid "Show thumbnails in the filebrowser" msgstr "Показувати ескізи зображень у вікні перегляду файлів" #: src/Gui/Preferences.cs:370 msgid "General" msgstr "Загальне" #: src/Gui/Preferences.cs:378 msgid "Don't prompt, always scan:" msgstr "Не запитувати, завжди сканувати:" #: src/Gui/Preferences.cs:397 msgid "Generate Thumbnails" msgstr "Створювати ескізи" #: src/Gui/Preferences.cs:401 msgid "Extract metadata" msgstr "Вилучення метаданих" #: src/Gui/Preferences.cs:405 msgid "Discard symbolic links" msgstr "Відхилити символічні посилання" #: src/Gui/Preferences.cs:409 msgid "Compute hashcodes for files (slow!)" msgstr "Підрахувати хеш-коди для файлів (довго!)" #: src/Gui/Preferences.cs:413 msgid "Fetch audio cd metadata from MusicBrainz.org" msgstr "Отримати метадані для аудіо дисків із сайту MusicBrainz.org" #: src/Gui/Preferences.cs:416 msgid "Scanner" msgstr "Сканер" Basenji/po/nl.po0000664000175000017500000005152312067326706013715 0ustar patrickpatrick# Dutch translation for basenji # Copyright (c) 2011 Rosetta Contributors and Canonical Ltd 2011 # This file is distributed under the same license as the basenji package. # FIRST AUTHOR , 2011. # msgid "" msgstr "" "Project-Id-Version: basenji\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2012-07-15 15:49+0200\n" "PO-Revision-Date: 2011-04-04 08:46+0000\n" "Last-Translator: Bjorn Robijns \n" "Language-Team: Dutch \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2012-10-27 11:00+0000\n" "X-Generator: Launchpad (build 16194)\n" #: src/Util.cs:30 #, csharp-format msgid "{0} Bytes" msgstr "{0} Bytes" #: src/Util.cs:32 msgid "Bytes" msgstr "Bytes" #: src/Util.cs:32 msgid "KB" msgstr "KB" #: src/Util.cs:32 msgid "MB" msgstr "MB" #: src/Util.cs:32 msgid "GB" msgstr "GB" #: src/Util.cs:32 msgid "TB" msgstr "TB" #: src/Options.cs:477 msgid "OptionName" msgstr "OptionName" #: src/FileDialog.cs:51 msgid "VolumeDatabase files" msgstr "VolumeDatabase files" #: src/FileDialog.cs:56 msgid "All files" msgstr "Alle bestanden" #: src/Main.cs:142 src/Gui/MainWindow.cs:76 src/Gui/MainWindow.cs:92 #: src/Gui/MainWindow.cs:334 src/Gui/MainWindow.cs:355 #: src/Gui/MainWindow.cs:377 src/Gui/MainWindow.cs:386 #: src/Gui/MainWindow.cs:635 msgid "Error" msgstr "Fout" #: src/Main.cs:142 #, csharp-format msgid "{0} is already running." msgstr "{0} wordt al uitgevoerd." #: src/Gui/Widgets/VolumeView.cs:42 src/Gui/Widgets/SearchResultView.cs:30 msgid "Unnamed" msgstr "Naamloos" #: src/Gui/Widgets/VolumeView.cs:43 #: src/Gui/Widgets/Editors/VolumeEditor.cs:259 msgid "Category:" msgstr "Categorie:" #: src/Gui/Widgets/VolumeView.cs:44 msgid "files" msgstr "bestanden" #: src/Gui/Widgets/VolumeView.cs:45 msgid "tracks" msgstr "nummers" #: src/Gui/Widgets/ItemView.cs:29 msgid "Loading..." msgstr "Bezig met laden..." #: src/Gui/Widgets/ItemView.cs:30 msgid "(empty)" msgstr "(leeg)" #: src/Gui/Widgets/ItemView.cs:99 src/Gui/DriveSelection.cs:80 msgid "Unknown" msgstr "Onbekend" #: src/Gui/Widgets/ItemView.cs:170 src/Gui/Widgets/Editors/ItemEditor.cs:96 msgid "Name" msgstr "Naam" #: src/Gui/Widgets/ItemView.cs:176 msgid "Artist" msgstr "Artiest" #: src/Gui/Widgets/ItemView.cs:181 #: src/Gui/Widgets/Editors/AudioTrackItemEditor.cs:53 #: src/Gui/Widgets/ItemInfo.cs:225 src/Gui/Widgets/ItemInfo.cs:288 msgid "Duration" msgstr "Duur" #: src/Gui/Widgets/Editors/FileSystemVolumeEditor.cs:34 #: src/Gui/DriveSelection.cs:168 msgid "Filesystem" msgstr "Bestandssysteem" #: src/Gui/Widgets/Editors/FileSystemVolumeEditor.cs:65 msgid "Files:" msgstr "Bestanden:" #: src/Gui/Widgets/Editors/FileSystemVolumeEditor.cs:66 msgid "Directories:" msgstr "Mappen:" #: src/Gui/Widgets/Editors/FileSystemVolumeEditor.cs:67 msgid "Total size:" msgstr "Totale grootte:" #: src/Gui/Widgets/Editors/ItemEditor.cs:95 msgid "Item type" msgstr "Item type" #: src/Gui/Widgets/Editors/ItemEditor.cs:111 src/Gui/Widgets/ItemInfo.cs:371 msgid "Note" msgstr "Notitie" #: src/Gui/Widgets/Editors/ItemEditor.cs:112 src/Gui/Widgets/ItemInfo.cs:374 msgid "Keywords" msgstr "Trefwoorden" #: src/Gui/Widgets/Editors/AudioTrackItemEditor.cs:31 #: src/Gui/Widgets/SearchResultView.cs:34 msgid "Audio CD track" msgstr "Audio CD nummer" #: src/Gui/Widgets/Editors/AudioTrackItemEditor.cs:54 #: src/Gui/Widgets/ItemInfo.cs:230 msgid "Type" msgstr "Type" #: src/Gui/Widgets/Editors/DirectoryItemEditor.cs:28 msgid "Directory" msgstr "Map" #: src/Gui/Widgets/Editors/FileSystemItemEditor.cs:59 #: src/Gui/Widgets/SearchResultView.cs:31 src/Gui/Widgets/ItemInfo.cs:183 msgid "Location" msgstr "Locatie" #: src/Gui/Widgets/Editors/FileSystemItemEditor.cs:60 #: src/Gui/Widgets/ItemInfo.cs:185 msgid "Last write time" msgstr "Laatst bewerkt" #: src/Gui/Widgets/Editors/FileSystemItemEditor.cs:61 #: src/Gui/Widgets/ItemInfo.cs:210 msgid "Filetype" msgstr "Bestandstype" #: src/Gui/Widgets/Editors/FileItemEditor.cs:31 msgid "File" msgstr "Bestand" #: src/Gui/Widgets/Editors/FileItemEditor.cs:52 #: src/Gui/Widgets/ItemInfo.cs:204 src/Gui/Widgets/ItemInfo.cs:226 #: src/Gui/DriveSelection.cs:148 msgid "Size" msgstr "Grootte" #: src/Gui/Widgets/Editors/FileItemEditor.cs:53 #: src/Gui/Widgets/ItemInfo.cs:206 msgid "Hash" msgstr "Hash" #: src/Gui/Widgets/Editors/AudioCdVolumeEditor.cs:33 msgid "Audio CD" msgstr "Audio CD" #: src/Gui/Widgets/Editors/AudioCdVolumeEditor.cs:63 msgid "Tracks:" msgstr "Nummers:" #: src/Gui/Widgets/Editors/AudioCdVolumeEditor.cs:64 msgid "Duration:" msgstr "Duur:" #: src/Gui/Widgets/Editors/VolumeEditor.cs:45 msgid "Backup" msgstr "Backup" #: src/Gui/Widgets/Editors/VolumeEditor.cs:46 #: src/Gui/Widgets/CategoryView.cs:60 msgid "Documents" msgstr "Documenten" #: src/Gui/Widgets/Editors/VolumeEditor.cs:47 #: src/Gui/Widgets/CategoryView.cs:61 msgid "Music" msgstr "Muziek" #: src/Gui/Widgets/Editors/VolumeEditor.cs:48 msgid "Audiobooks" msgstr "Audiobooks" #: src/Gui/Widgets/Editors/VolumeEditor.cs:49 #: src/Gui/Widgets/CategoryView.cs:62 msgid "Movies" msgstr "Films" #: src/Gui/Widgets/Editors/VolumeEditor.cs:50 msgid "Videos" msgstr "Filmpjes" #: src/Gui/Widgets/Editors/VolumeEditor.cs:51 msgid "Pictures" msgstr "Afbeeldingen" #: src/Gui/Widgets/Editors/VolumeEditor.cs:52 msgid "Games" msgstr "Spelletjes" #: src/Gui/Widgets/Editors/VolumeEditor.cs:53 src/Gui/Widgets/ItemInfo.cs:319 msgid "Software" msgstr "Software" #: src/Gui/Widgets/Editors/VolumeEditor.cs:54 msgid "Misc" msgstr "Diversen" #: src/Gui/Widgets/Editors/VolumeEditor.cs:55 msgid "Other" msgstr "Andere" #: src/Gui/Widgets/Editors/VolumeEditor.cs:225 msgid "Yes" msgstr "Ja" #: src/Gui/Widgets/Editors/VolumeEditor.cs:225 msgid "No" msgstr "Nee" #: src/Gui/Widgets/Editors/VolumeEditor.cs:235 msgid "Volume type:" msgstr "Volume type:" #: src/Gui/Widgets/Editors/VolumeEditor.cs:236 msgid "Hashed:" msgstr "Hashed:" #: src/Gui/Widgets/Editors/VolumeEditor.cs:237 msgid "Added:" msgstr "Toegevoegd:" #: src/Gui/Widgets/Editors/VolumeEditor.cs:258 msgid "Archive No.:" msgstr "Archief #:" #: src/Gui/Widgets/Editors/VolumeEditor.cs:260 msgid "Title:" msgstr "Titel:" #: src/Gui/Widgets/Editors/VolumeEditor.cs:261 src/Gui/DBProperties.cs:98 msgid "Description:" msgstr "Beschrijving:" #: src/Gui/Widgets/Editors/VolumeEditor.cs:262 msgid "Keywords:" msgstr "Trefwoorden:" #: src/Gui/Widgets/Editors/VolumeEditor.cs:263 msgid "Loaned to:" msgstr "Uitgeleend aan:" #: src/Gui/Widgets/Editors/VolumeEditor.cs:264 msgid "Loaned date:" msgstr "Uitleendatum:" #: src/Gui/Widgets/Editors/VolumeEditor.cs:265 msgid "Return date:" msgstr "Terug op:" #: src/Gui/Widgets/CategoryView.cs:58 msgid "Directories" msgstr "Mappen" #: src/Gui/Widgets/CategoryView.cs:59 msgid "Text" msgstr "Tekst" #: src/Gui/Widgets/CategoryView.cs:63 msgid "Images" msgstr "Afbeeldingen" #: src/Gui/Widgets/CategoryView.cs:64 msgid "Applications" msgstr "Programma's" #: src/Gui/Widgets/CategoryView.cs:65 msgid "Archives" msgstr "Archieven" #: src/Gui/Widgets/CategoryView.cs:66 msgid "Development" msgstr "Ontwikkeling" #: src/Gui/Widgets/CategoryView.cs:96 src/Gui/MainWindow.cs:1046 msgid "Category" msgstr "Categorie" #: src/Gui/Widgets/CategoryView.cs:128 msgid "All items" msgstr "Alle items" #: src/Gui/Widgets/SearchResultView.cs:32 msgid "Volume" msgstr "Volume" #: src/Gui/Widgets/SearchResultView.cs:33 src/Gui/MainWindow.cs:1040 msgid "Archive No." msgstr "Archief No." #: src/Gui/Widgets/ItemInfo.cs:40 msgid "by" msgstr "door" #: src/Gui/Widgets/ItemInfo.cs:41 msgid "from" msgstr "van" #: src/Gui/Widgets/ItemInfo.cs:196 msgid "Symlink target" msgstr "Symlink doel" #: src/Gui/Widgets/ItemInfo.cs:227 msgid "Track No." msgstr "Nummer #" #: src/Gui/Widgets/ItemInfo.cs:258 msgid "Genre" msgstr "Genre" #: src/Gui/Widgets/ItemInfo.cs:278 msgid "Year" msgstr "Jaar" #: src/Gui/Widgets/ItemInfo.cs:283 msgid "Description" msgstr "Beschrijving" #: src/Gui/Widgets/ItemInfo.cs:294 msgid "Dimensions" msgstr "Afmetingen" #: src/Gui/Widgets/ItemInfo.cs:299 msgid "Format" msgstr "Indeling" #: src/Gui/Widgets/ItemInfo.cs:303 msgid "Author" msgstr "Auteur" #: src/Gui/Widgets/ItemInfo.cs:307 msgid "Copyright" msgstr "Copyright" #: src/Gui/Widgets/ItemInfo.cs:311 msgid "Producer" msgstr "Producent" #: src/Gui/Widgets/ItemInfo.cs:315 msgid "Creator" msgstr "Ontwikkelaar" #: src/Gui/Widgets/ItemInfo.cs:323 msgid "Language" msgstr "Taal" #: src/Gui/Widgets/ItemInfo.cs:327 msgid "Page count" msgstr "Aantal pagina's" #: src/Gui/Widgets/ItemInfo.cs:346 msgid "File count" msgstr "Aantal bestanden" #: src/Gui/Widgets/PageNavigation.cs:27 msgid "No items." msgstr "Geen items." #: src/Gui/Widgets/PageNavigation.cs:145 #, csharp-format msgid "Page {0}/{1} ({2} - {3} of {4} items)" msgstr "Pagina {0}/{1} ({2} - {3} of {4} items)" #: src/Gui/ObjectProperties.cs:54 src/Gui/VolumeScanner.cs:248 msgid "Invalid data" msgstr "Ongeldige gegevens" #: src/Gui/ObjectProperties.cs:54 src/Gui/VolumeScanner.cs:249 #, csharp-format msgid "" "\"{0}\" is {1}.\n" "\n" "Expected format: {2}\n" "Please correct or remove the data you entered." msgstr "" "\"{0}\" is {1}.\n" "\n" "Verwachte indeling: {2}\n" "Corrigeer of verwijder de data die u heeft ingevoerd." #: src/Gui/DBProperties.cs:85 msgid "Database Properties" msgstr "Gegevensbestand eigenschappen" #: src/Gui/DBProperties.cs:97 msgid "Name:" msgstr "Naam:" #: src/Gui/DBProperties.cs:99 msgid "Created:" msgstr "Gemaakt op:" #: src/Gui/VolumeProperties.cs:29 msgid "Volume Properties" msgstr "Volume eigenschappen" #: src/Gui/DriveSelection.cs:60 msgid "Waiting for drives..." msgstr "Wachten op stations..." #: src/Gui/DriveSelection.cs:133 msgid "Drive" msgstr "Station" #: src/Gui/DriveSelection.cs:139 msgid "Label" msgstr "Label" #: src/Gui/DriveSelection.cs:241 msgid "Please select a drive to scan" msgstr "Selecteer een station om te scannen" #: src/Gui/About.cs:28 msgid "A cross-platform media indexing/search tool." msgstr "" #: src/Gui/About.cs:29 #, csharp-format msgid "Using VolumeDB v{0}." msgstr "VolumeDB v{0} wordt gebruikt." #: src/Gui/About.cs:31 msgid "Copyright (c) " msgstr "Copyright (c) " #: src/Gui/ItemSearch.cs:81 #, csharp-format msgid "Found {0} items in {1:F3} seconds." msgstr "{0} items gevonden in {1:F3} seconden." #: src/Gui/ItemSearch.cs:92 src/Gui/MainWindow.cs:519 msgid "Timeout: another search is probably still in progress." msgstr "Wachttijd: een andere zoekopdracht is nog bezig." #: src/Gui/ItemSearch.cs:94 msgid "Too many search results. Please refine your search criteria." msgstr "Teveel zoekresultaten. Gelieve zoekcriteria te specifiëren." #: src/Gui/ItemSearch.cs:112 src/Gui/MainWindow.cs:535 msgid "Searching..." msgstr "Bezig met zoeken..." #: src/Gui/ItemSearch.cs:267 msgid "Search Items" msgstr "Items zoeken" #: src/Gui/ItemSearch.cs:279 src/Gui/MainWindow.cs:1145 msgid "default" msgstr "standaad" #: src/Gui/ItemSearch.cs:283 msgid "Search items" msgstr "Item bewerken" #: src/Gui/ItemSearch.cs:318 msgid "Quick tip:" msgstr "" #: src/Gui/ItemSearch.cs:319 #, csharp-format msgid "" "Click on the icon to the left of the search field to build advanced search " "queries.\n" "Example: {0}" msgstr "" #: src/Gui/ItemSearch.cs:326 msgid "No search results." msgstr "Geen zoekresultaten." #: src/Gui/ItemSearch.cs:375 src/Gui/MainWindow.cs:1028 msgid "Edit Item" msgstr "Item bewerken" #: src/Gui/ItemSearch.cs:382 msgid "Show in Main Window" msgstr "" #: src/Gui/MainWindow.cs:77 src/Gui/MainWindow.cs:93 src/Gui/MainWindow.cs:635 #, csharp-format msgid "Database '{0}' not found." msgstr "Gegevensbestand '{0}' niet gevonden." #: src/Gui/MainWindow.cs:185 msgid "Database not found" msgstr "Gegevensbestand niet gevonden" #: src/Gui/MainWindow.cs:186 msgid "Default database not found. Create?" msgstr "Standaard gegevensbestand niet gevonden. Aanmaken?" #: src/Gui/MainWindow.cs:215 msgid "Unsupported database version" msgstr "Niet ondersteund gegevensbestand" #: src/Gui/MainWindow.cs:216 msgid "This database version is not supported." msgstr "Dit gegevensbestand wordt niet ondersteund." #: src/Gui/MainWindow.cs:235 #, csharp-format msgid "{0} volumes loaded." msgstr "{0} volumes geladen." #: src/Gui/MainWindow.cs:256 #, csharp-format msgid "An error occured while loading the volume list: {0}" msgstr "Een fout trad op bij het laden van de lijst met volumes: {0}" #: src/Gui/MainWindow.cs:300 msgid "Please enter the name for the new database" msgstr "Geef een naam op voor het nieuwe gegevensbestand" #: src/Gui/MainWindow.cs:312 msgid "Database exists" msgstr "Gegevensbestand bestaat" #: src/Gui/MainWindow.cs:313 msgid "Database already exists. Overwrite?" msgstr "Gegevensbestand bestaat al. Overschrijven?" #: src/Gui/MainWindow.cs:326 msgid "Please select a database" msgstr "Selecteer een gegevensbestand" #: src/Gui/MainWindow.cs:335 src/Gui/Import.cs:83 msgid "Database not found." msgstr "Gegevensbestand niet gevonden." #: src/Gui/MainWindow.cs:356 #, csharp-format msgid "" "An error occured while accessing drive {0}:\n" "{1}" msgstr "" "Een fout trad op bij het lezen van station {0}:\n" "{1}" #: src/Gui/MainWindow.cs:378 #, csharp-format msgid "Drive {0} is not ready." msgstr "Station {0} is niet gereed." #: src/Gui/MainWindow.cs:387 #, csharp-format msgid "Drive {0} is neither mounted nor does it contain an audio cd." msgstr "Station {0} is niet aangesloten of bevat geen audio cd." #: src/Gui/MainWindow.cs:406 msgid "Confirmation" msgstr "Bevestiging" #: src/Gui/MainWindow.cs:407 msgid "Are you sure you really want to remove the selected volume?" msgstr "Bent u zeker dat u het geselecteerde volume wilt verwijderen?" #: src/Gui/MainWindow.cs:712 #, csharp-format msgid "Please insert volume '{0}'." msgstr "" #: src/Gui/MainWindow.cs:714 msgid "Waiting for volume" msgstr "" #: src/Gui/MainWindow.cs:966 msgid "Add Volume" msgstr "" #: src/Gui/MainWindow.cs:970 msgid "Search" msgstr "" #: src/Gui/MainWindow.cs:973 msgid "App Menu" msgstr "" #: src/Gui/MainWindow.cs:979 msgid "_New Database" msgstr "_Nieuw gegevensbestand" #: src/Gui/MainWindow.cs:982 msgid "_Open Database" msgstr "_Open gegevensbestand" #: src/Gui/MainWindow.cs:985 msgid "Open Default Database" msgstr "Open standaard gegevensbestand" #: src/Gui/MainWindow.cs:991 msgid "Recent Databases" msgstr "Recente gegevensbestanden" #: src/Gui/MainWindow.cs:998 msgid "_Import" msgstr "_Importeren" #: src/Gui/MainWindow.cs:1001 msgid "_Preferences" msgstr "_Voorkeuren" #: src/Gui/MainWindow.cs:1004 msgid "_Database Properties" msgstr "Gegevensbestand eigenschappen" #: src/Gui/MainWindow.cs:1007 msgid "Info" msgstr "" #: src/Gui/MainWindow.cs:1010 msgid "_Quit" msgstr "_Afsluiten" #: src/Gui/MainWindow.cs:1016 msgid "_Edit Volume" msgstr "Volume _bewerken" #: src/Gui/MainWindow.cs:1019 msgid "_Remove Volume" msgstr "Volume _verwijderen" #: src/Gui/MainWindow.cs:1022 msgid "Rescan Volume" msgstr "" #: src/Gui/MainWindow.cs:1034 msgid "Sort by" msgstr "Sorteer op" #: src/Gui/MainWindow.cs:1037 msgid "Descending" msgstr "Aflopend" #: src/Gui/MainWindow.cs:1043 msgid "Date added" msgstr "Datum toegevoegd" #: src/Gui/MainWindow.cs:1044 msgid "Title" msgstr "Titel" #: src/Gui/MainWindow.cs:1045 msgid "Drivetype" msgstr "Stationtype" #: src/Gui/MainWindow.cs:1142 msgid "Filter volumes" msgstr "Volumes filteren" #: src/Gui/Import.cs:29 msgid "Import" msgstr "Importeer" #: src/Gui/Import.cs:30 msgid "Abort" msgstr "Afbreken" #: src/Gui/Import.cs:31 msgid "Please select a database." msgstr "" #: src/Gui/Import.cs:72 #, csharp-format msgid "{0:0}% completed." msgstr "{0:0}% voltooid." #: src/Gui/Import.cs:82 msgid "Import failed" msgstr "Importeren mislukt" #: src/Gui/Import.cs:85 msgid "Import failed!" msgstr "Importeren mislukt!" #: src/Gui/Import.cs:87 msgid "Import aborted." msgstr "Importeren afgebroken." #: src/Gui/Import.cs:89 msgid "Import completed successfully." msgstr "Importeren succesvol voltooid." #: src/Gui/Import.cs:121 msgid "Import in progress" msgstr "Bezig met importeren" #: src/Gui/Import.cs:122 msgid "You must stop the import before closing this window." msgstr "U moet het importeren stoppen om het venster te sluiten." #: src/Gui/Import.cs:148 msgid "Unknown format." msgstr "" #: src/Gui/Import.cs:175 msgid "Import Database" msgstr "Importeer gegevensbestand" #: src/Gui/Import.cs:186 msgid "Please select a database to import" msgstr "Selecteer een gegevensbestand om te importeren" #: src/Gui/Import.cs:194 msgid "All supported formats" msgstr "" #: src/Gui/Import.cs:198 #, csharp-format msgid ".{0} files" msgstr "" #: src/Gui/Import.cs:209 msgid "Database:" msgstr "Gegevensbestand:" #: src/Gui/Import.cs:210 msgid "Format:" msgstr "Indeling:" #: src/Gui/ItemProperties.cs:29 msgid "Item Properties" msgstr "Item eigenschappen" #: src/Gui/VolumeScanner.cs:116 msgid "Scanning started." msgstr "Scannen gestart." #: src/Gui/VolumeScanner.cs:118 #, csharp-format msgid "Scanning of drive '{0}' started." msgstr "Gestart met station '{0}' te scannen." #: src/Gui/VolumeScanner.cs:124 #, csharp-format msgid "" "Options: generate thumbs: {0}, extract metadata: {1}, discard symlinks: {2}, " "hashing: {3}." msgstr "" "Opties: maak miniaturen: {0}, uitpakken metadata: {1}, symbolische " "verwijzingen verwerpen: {2}, bezig met hashen: {3}." #: src/Gui/VolumeScanner.cs:131 #, csharp-format msgid "Options: MusicBrainz enabled: {0}" msgstr "Opties: MusicBrainz ingeschakeld: {0}" #: src/Gui/VolumeScanner.cs:157 msgid "Time" msgstr "Tijd" #: src/Gui/VolumeScanner.cs:161 msgid "Message" msgstr "Boodschap" #: src/Gui/VolumeScanner.cs:258 msgid "Stopping Scanner and performing rollback..." msgstr "Scan stoppen en bezig met terugzetten..." #: src/Gui/VolumeScanner.cs:268 msgid "yes" msgstr "ja" #: src/Gui/VolumeScanner.cs:268 msgid "no" msgstr "nee" #: src/Gui/VolumeScanner.cs:291 msgid "Scan in progress" msgstr "Bezig met scannen" #: src/Gui/VolumeScanner.cs:291 msgid "You must stop scanning before closing this window." msgstr "U moet de scan stoppen om het venster te sluiten." #: src/Gui/VolumeScanner.cs:346 #, csharp-format msgid "An unhandled exception occured ({0})." msgstr "Een onbekende fout trad op ({0})." #: src/Gui/VolumeScanner.cs:347 msgid "All database changes have been rolled back." msgstr "Alle wijzigingen zijn teruggezet." #: src/Gui/VolumeScanner.cs:354 #, csharp-format msgid "Scanning failed. Reason: an unhandled exception occured ({0})." msgstr "Scannen mislukt. Reden: een onbekende fout is opgetreden ({0})." #: src/Gui/VolumeScanner.cs:356 msgid "Scanning aborted." msgstr "Scan beëindigd." #: src/Gui/VolumeScanner.cs:358 msgid "Scanning completed successfully." msgstr "Scan succesvol beëindigd." #: src/Gui/VolumeScanner.cs:488 msgid "VolumeScanner" msgstr "VolumeScanner" #: src/Gui/VolumeScanner.cs:500 msgid "Volume Information:" msgstr "Volume Informatie:" #: src/Gui/VolumeScanner.cs:510 msgid "Scanner Log:" msgstr "Scanner log:" #: src/Gui/VolumeScanner.cs:527 msgid "Database access" msgstr "Gegevensbestand toegang" #: src/Gui/Preferences.cs:119 msgid "None" msgstr "Geen" #: src/Gui/Preferences.cs:228 msgid "Unsupported theme" msgstr "Thema niet ondersteund" #: src/Gui/Preferences.cs:229 msgid "The selected icon theme is currently not supported on your system." msgstr "" "Het geselecteerde icoon thema wordt momenteel niet ondersteund op uw systeem." #: src/Gui/Preferences.cs:267 msgid "Restart required" msgstr "Opnieuw opstarten noodzakelijk" #: src/Gui/Preferences.cs:268 #, csharp-format msgid "You must restart {0} for icontheme changes to take effect." msgstr "U moet {0} opnieuw opstarten om het icoon thema toe te passen." #: src/Gui/Preferences.cs:298 msgid "Preferences" msgstr "Voorkeuren" #: src/Gui/Preferences.cs:322 msgid "_Load Defaults" msgstr "_Laad standaard" #: src/Gui/Preferences.cs:349 msgid "Icon theme:" msgstr "Icoon thema:" #: src/Gui/Preferences.cs:355 msgid "Reopen most recent database on startup" msgstr "Heropen meest recent gegevensbestand bij opstarten" #: src/Gui/Preferences.cs:359 msgid "Show iteminfo panel" msgstr "Toon iteminformatie paneel" #: src/Gui/Preferences.cs:363 msgid "Show hidden files" msgstr "Toon verborgen bestanden" #: src/Gui/Preferences.cs:367 msgid "Show thumbnails in the filebrowser" msgstr "Toon miniaturen in bestandsverkenner" #: src/Gui/Preferences.cs:370 msgid "General" msgstr "Algemeen" #: src/Gui/Preferences.cs:378 msgid "Don't prompt, always scan:" msgstr "Niet vragen, scan altijd:" #: src/Gui/Preferences.cs:397 msgid "Generate Thumbnails" msgstr "Maak miniatuurweergaven" #: src/Gui/Preferences.cs:401 msgid "Extract metadata" msgstr "Metadata uitpakken" #: src/Gui/Preferences.cs:405 msgid "Discard symbolic links" msgstr "Negeer symbolische verwijzingen" #: src/Gui/Preferences.cs:409 msgid "Compute hashcodes for files (slow!)" msgstr "Bereken hashcodes voor bestanden (traag!)" #: src/Gui/Preferences.cs:413 msgid "Fetch audio cd metadata from MusicBrainz.org" msgstr "Haal audio cd metadata van MusicBrainz.org" #: src/Gui/Preferences.cs:416 msgid "Scanner" msgstr "Scanner" Basenji/po/pt_BR.po0000664000175000017500000005315112067326706014311 0ustar patrickpatrick# Brazilian Portuguese translation for basenji # Copyright (c) 2010 Rosetta Contributors and Canonical Ltd 2010 # This file is distributed under the same license as the basenji package. # FIRST AUTHOR , 2010. # msgid "" msgstr "" "Project-Id-Version: basenji\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2012-07-15 15:49+0200\n" "PO-Revision-Date: 2012-01-06 18:32+0000\n" "Last-Translator: Ulisses de C. Soares \n" "Language-Team: Brazilian Portuguese \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2012-10-27 11:00+0000\n" "X-Generator: Launchpad (build 16194)\n" #: src/Util.cs:30 #, csharp-format msgid "{0} Bytes" msgstr "{0} Bytes" #: src/Util.cs:32 msgid "Bytes" msgstr "Bytes" #: src/Util.cs:32 msgid "KB" msgstr "kB" #: src/Util.cs:32 msgid "MB" msgstr "MB" #: src/Util.cs:32 msgid "GB" msgstr "GB" #: src/Util.cs:32 msgid "TB" msgstr "TB" #: src/Options.cs:477 msgid "OptionName" msgstr "Nome da opção" #: src/FileDialog.cs:51 msgid "VolumeDatabase files" msgstr "Arquivos do VolumeDatabase" #: src/FileDialog.cs:56 msgid "All files" msgstr "Todos os arquivos" #: src/Main.cs:142 src/Gui/MainWindow.cs:76 src/Gui/MainWindow.cs:92 #: src/Gui/MainWindow.cs:334 src/Gui/MainWindow.cs:355 #: src/Gui/MainWindow.cs:377 src/Gui/MainWindow.cs:386 #: src/Gui/MainWindow.cs:635 msgid "Error" msgstr "Erro" #: src/Main.cs:142 #, csharp-format msgid "{0} is already running." msgstr "{0} já está em execução." #: src/Gui/Widgets/VolumeView.cs:42 src/Gui/Widgets/SearchResultView.cs:30 msgid "Unnamed" msgstr "Sem nome" #: src/Gui/Widgets/VolumeView.cs:43 #: src/Gui/Widgets/Editors/VolumeEditor.cs:259 msgid "Category:" msgstr "Categoria:" #: src/Gui/Widgets/VolumeView.cs:44 msgid "files" msgstr "arquivos" #: src/Gui/Widgets/VolumeView.cs:45 msgid "tracks" msgstr "faixas" #: src/Gui/Widgets/ItemView.cs:29 msgid "Loading..." msgstr "Carregando..." #: src/Gui/Widgets/ItemView.cs:30 msgid "(empty)" msgstr "(vazio)" #: src/Gui/Widgets/ItemView.cs:99 src/Gui/DriveSelection.cs:80 msgid "Unknown" msgstr "Desconhecido" #: src/Gui/Widgets/ItemView.cs:170 src/Gui/Widgets/Editors/ItemEditor.cs:96 msgid "Name" msgstr "Nome" #: src/Gui/Widgets/ItemView.cs:176 msgid "Artist" msgstr "Artista" #: src/Gui/Widgets/ItemView.cs:181 #: src/Gui/Widgets/Editors/AudioTrackItemEditor.cs:53 #: src/Gui/Widgets/ItemInfo.cs:225 src/Gui/Widgets/ItemInfo.cs:288 msgid "Duration" msgstr "Duração" #: src/Gui/Widgets/Editors/FileSystemVolumeEditor.cs:34 #: src/Gui/DriveSelection.cs:168 msgid "Filesystem" msgstr "Sistema de arquivos" #: src/Gui/Widgets/Editors/FileSystemVolumeEditor.cs:65 msgid "Files:" msgstr "Arquivos:" #: src/Gui/Widgets/Editors/FileSystemVolumeEditor.cs:66 msgid "Directories:" msgstr "Pastas:" #: src/Gui/Widgets/Editors/FileSystemVolumeEditor.cs:67 msgid "Total size:" msgstr "Tamanho total:" #: src/Gui/Widgets/Editors/ItemEditor.cs:95 msgid "Item type" msgstr "Tipo de item" #: src/Gui/Widgets/Editors/ItemEditor.cs:111 src/Gui/Widgets/ItemInfo.cs:371 msgid "Note" msgstr "Nota" #: src/Gui/Widgets/Editors/ItemEditor.cs:112 src/Gui/Widgets/ItemInfo.cs:374 msgid "Keywords" msgstr "Palavras-chave" #: src/Gui/Widgets/Editors/AudioTrackItemEditor.cs:31 #: src/Gui/Widgets/SearchResultView.cs:34 msgid "Audio CD track" msgstr "Faixa de áudio de CD" #: src/Gui/Widgets/Editors/AudioTrackItemEditor.cs:54 #: src/Gui/Widgets/ItemInfo.cs:230 msgid "Type" msgstr "Tipo" #: src/Gui/Widgets/Editors/DirectoryItemEditor.cs:28 msgid "Directory" msgstr "Pasta" #: src/Gui/Widgets/Editors/FileSystemItemEditor.cs:59 #: src/Gui/Widgets/SearchResultView.cs:31 src/Gui/Widgets/ItemInfo.cs:183 msgid "Location" msgstr "Local" #: src/Gui/Widgets/Editors/FileSystemItemEditor.cs:60 #: src/Gui/Widgets/ItemInfo.cs:185 msgid "Last write time" msgstr "Modificado pela última vez" #: src/Gui/Widgets/Editors/FileSystemItemEditor.cs:61 #: src/Gui/Widgets/ItemInfo.cs:210 msgid "Filetype" msgstr "Tipo de arquivo" #: src/Gui/Widgets/Editors/FileItemEditor.cs:31 msgid "File" msgstr "Arquivo" #: src/Gui/Widgets/Editors/FileItemEditor.cs:52 #: src/Gui/Widgets/ItemInfo.cs:204 src/Gui/Widgets/ItemInfo.cs:226 #: src/Gui/DriveSelection.cs:148 msgid "Size" msgstr "Tamanho" #: src/Gui/Widgets/Editors/FileItemEditor.cs:53 #: src/Gui/Widgets/ItemInfo.cs:206 msgid "Hash" msgstr "Hash" #: src/Gui/Widgets/Editors/AudioCdVolumeEditor.cs:33 msgid "Audio CD" msgstr "CD de áudio" #: src/Gui/Widgets/Editors/AudioCdVolumeEditor.cs:63 msgid "Tracks:" msgstr "Faixas:" #: src/Gui/Widgets/Editors/AudioCdVolumeEditor.cs:64 msgid "Duration:" msgstr "Duração:" #: src/Gui/Widgets/Editors/VolumeEditor.cs:45 msgid "Backup" msgstr "Cópia de segurança" #: src/Gui/Widgets/Editors/VolumeEditor.cs:46 #: src/Gui/Widgets/CategoryView.cs:60 msgid "Documents" msgstr "Documentos" #: src/Gui/Widgets/Editors/VolumeEditor.cs:47 #: src/Gui/Widgets/CategoryView.cs:61 msgid "Music" msgstr "Músicas" #: src/Gui/Widgets/Editors/VolumeEditor.cs:48 msgid "Audiobooks" msgstr "Livros em áudio" #: src/Gui/Widgets/Editors/VolumeEditor.cs:49 #: src/Gui/Widgets/CategoryView.cs:62 msgid "Movies" msgstr "Filmes" #: src/Gui/Widgets/Editors/VolumeEditor.cs:50 msgid "Videos" msgstr "Vídeos" #: src/Gui/Widgets/Editors/VolumeEditor.cs:51 msgid "Pictures" msgstr "Imagens" #: src/Gui/Widgets/Editors/VolumeEditor.cs:52 msgid "Games" msgstr "Jogos" #: src/Gui/Widgets/Editors/VolumeEditor.cs:53 src/Gui/Widgets/ItemInfo.cs:319 msgid "Software" msgstr "Aplicativos" #: src/Gui/Widgets/Editors/VolumeEditor.cs:54 msgid "Misc" msgstr "Diversos" #: src/Gui/Widgets/Editors/VolumeEditor.cs:55 msgid "Other" msgstr "Outros" #: src/Gui/Widgets/Editors/VolumeEditor.cs:225 msgid "Yes" msgstr "Sim" #: src/Gui/Widgets/Editors/VolumeEditor.cs:225 msgid "No" msgstr "Não" #: src/Gui/Widgets/Editors/VolumeEditor.cs:235 msgid "Volume type:" msgstr "Tipo de volume de mídia:" #: src/Gui/Widgets/Editors/VolumeEditor.cs:236 msgid "Hashed:" msgstr "Hash gerado:" #: src/Gui/Widgets/Editors/VolumeEditor.cs:237 msgid "Added:" msgstr "Adicionado:" #: src/Gui/Widgets/Editors/VolumeEditor.cs:258 msgid "Archive No.:" msgstr "Arquivo nº:" #: src/Gui/Widgets/Editors/VolumeEditor.cs:260 msgid "Title:" msgstr "Título:" #: src/Gui/Widgets/Editors/VolumeEditor.cs:261 src/Gui/DBProperties.cs:98 msgid "Description:" msgstr "Descrição:" #: src/Gui/Widgets/Editors/VolumeEditor.cs:262 msgid "Keywords:" msgstr "Palavras-chave:" #: src/Gui/Widgets/Editors/VolumeEditor.cs:263 msgid "Loaned to:" msgstr "Emprestado para:" #: src/Gui/Widgets/Editors/VolumeEditor.cs:264 msgid "Loaned date:" msgstr "Data do empréstimo:" #: src/Gui/Widgets/Editors/VolumeEditor.cs:265 msgid "Return date:" msgstr "Data de devolução:" #: src/Gui/Widgets/CategoryView.cs:58 msgid "Directories" msgstr "Pastas" #: src/Gui/Widgets/CategoryView.cs:59 msgid "Text" msgstr "Texto" #: src/Gui/Widgets/CategoryView.cs:63 msgid "Images" msgstr "Imagens" #: src/Gui/Widgets/CategoryView.cs:64 msgid "Applications" msgstr "Aplicativos" #: src/Gui/Widgets/CategoryView.cs:65 msgid "Archives" msgstr "Arquivos" #: src/Gui/Widgets/CategoryView.cs:66 msgid "Development" msgstr "Desenvolvimento" #: src/Gui/Widgets/CategoryView.cs:96 src/Gui/MainWindow.cs:1046 msgid "Category" msgstr "Categoria" #: src/Gui/Widgets/CategoryView.cs:128 msgid "All items" msgstr "Todos os itens" #: src/Gui/Widgets/SearchResultView.cs:32 msgid "Volume" msgstr "Volume de mídia" #: src/Gui/Widgets/SearchResultView.cs:33 src/Gui/MainWindow.cs:1040 msgid "Archive No." msgstr "Arquivo nº" #: src/Gui/Widgets/ItemInfo.cs:40 msgid "by" msgstr "por" #: src/Gui/Widgets/ItemInfo.cs:41 msgid "from" msgstr "de" #: src/Gui/Widgets/ItemInfo.cs:196 msgid "Symlink target" msgstr "Alvo do link simbólico" #: src/Gui/Widgets/ItemInfo.cs:227 msgid "Track No." msgstr "Faixa nº:" #: src/Gui/Widgets/ItemInfo.cs:258 msgid "Genre" msgstr "Gênero" #: src/Gui/Widgets/ItemInfo.cs:278 msgid "Year" msgstr "Ano" #: src/Gui/Widgets/ItemInfo.cs:283 msgid "Description" msgstr "Descrição" #: src/Gui/Widgets/ItemInfo.cs:294 msgid "Dimensions" msgstr "Dimensões" #: src/Gui/Widgets/ItemInfo.cs:299 msgid "Format" msgstr "Formato" #: src/Gui/Widgets/ItemInfo.cs:303 msgid "Author" msgstr "Autor" #: src/Gui/Widgets/ItemInfo.cs:307 msgid "Copyright" msgstr "Direitos autorais" #: src/Gui/Widgets/ItemInfo.cs:311 msgid "Producer" msgstr "Produtor" #: src/Gui/Widgets/ItemInfo.cs:315 msgid "Creator" msgstr "Criador" #: src/Gui/Widgets/ItemInfo.cs:323 msgid "Language" msgstr "Idioma" #: src/Gui/Widgets/ItemInfo.cs:327 msgid "Page count" msgstr "Número de páginas" #: src/Gui/Widgets/ItemInfo.cs:346 msgid "File count" msgstr "Número de arquivos" #: src/Gui/Widgets/PageNavigation.cs:27 msgid "No items." msgstr "Sem itens." #: src/Gui/Widgets/PageNavigation.cs:145 #, csharp-format msgid "Page {0}/{1} ({2} - {3} of {4} items)" msgstr "Página {0}/{1} ({2} - {3} de {4} itens)" #: src/Gui/ObjectProperties.cs:54 src/Gui/VolumeScanner.cs:248 msgid "Invalid data" msgstr "Dados inválidos" #: src/Gui/ObjectProperties.cs:54 src/Gui/VolumeScanner.cs:249 #, csharp-format msgid "" "\"{0}\" is {1}.\n" "\n" "Expected format: {2}\n" "Please correct or remove the data you entered." msgstr "" "\"{0}\" é {1}.\n" "\n" "Formato esperado: {2}\n" "Por favor corrija ou remova os dados fornecidos." #: src/Gui/DBProperties.cs:85 msgid "Database Properties" msgstr "Propriedades do banco de dados" #: src/Gui/DBProperties.cs:97 msgid "Name:" msgstr "Nome:" #: src/Gui/DBProperties.cs:99 msgid "Created:" msgstr "Criado em:" #: src/Gui/VolumeProperties.cs:29 msgid "Volume Properties" msgstr "Propriedades do volume de mídia" #: src/Gui/DriveSelection.cs:60 msgid "Waiting for drives..." msgstr "Aguardando as unidades..." #: src/Gui/DriveSelection.cs:133 msgid "Drive" msgstr "Unidade" #: src/Gui/DriveSelection.cs:139 msgid "Label" msgstr "Rótulo" #: src/Gui/DriveSelection.cs:241 msgid "Please select a drive to scan" msgstr "Por favor escolha uma unidade para escanear" #: src/Gui/About.cs:28 msgid "A cross-platform media indexing/search tool." msgstr "Uma ferrammenta de busca/indexação de mídia multi-plataforma." #: src/Gui/About.cs:29 #, csharp-format msgid "Using VolumeDB v{0}." msgstr "Utiliza VolumeDB v{0}." #: src/Gui/About.cs:31 msgid "Copyright (c) " msgstr "Direitos autorais (c) " #: src/Gui/ItemSearch.cs:81 #, csharp-format msgid "Found {0} items in {1:F3} seconds." msgstr "Encontrados {0} itens em {1:F3} segundos." #: src/Gui/ItemSearch.cs:92 src/Gui/MainWindow.cs:519 msgid "Timeout: another search is probably still in progress." msgstr "Tempo esgotado: provavelmente outra pesquisa está em andamento." #: src/Gui/ItemSearch.cs:94 msgid "Too many search results. Please refine your search criteria." msgstr "" "Quantidade excessiva de resultados. Por favor aprimore seus critérios de " "pesquisa." #: src/Gui/ItemSearch.cs:112 src/Gui/MainWindow.cs:535 msgid "Searching..." msgstr "Pesquisando..." #: src/Gui/ItemSearch.cs:267 msgid "Search Items" msgstr "Pesquisar itens" #: src/Gui/ItemSearch.cs:279 src/Gui/MainWindow.cs:1145 msgid "default" msgstr "Padrão" #: src/Gui/ItemSearch.cs:283 msgid "Search items" msgstr "Pesquisar itens" #: src/Gui/ItemSearch.cs:318 msgid "Quick tip:" msgstr "" #: src/Gui/ItemSearch.cs:319 #, csharp-format msgid "" "Click on the icon to the left of the search field to build advanced search " "queries.\n" "Example: {0}" msgstr "" #: src/Gui/ItemSearch.cs:326 msgid "No search results." msgstr "Nenhum resultado encontrado." #: src/Gui/ItemSearch.cs:375 src/Gui/MainWindow.cs:1028 msgid "Edit Item" msgstr "Editar Item" #: src/Gui/ItemSearch.cs:382 msgid "Show in Main Window" msgstr "" #: src/Gui/MainWindow.cs:77 src/Gui/MainWindow.cs:93 src/Gui/MainWindow.cs:635 #, csharp-format msgid "Database '{0}' not found." msgstr "O banco de dados '{0}' não foi encontrado." #: src/Gui/MainWindow.cs:185 msgid "Database not found" msgstr "Banco de dados não encontrado." #: src/Gui/MainWindow.cs:186 msgid "Default database not found. Create?" msgstr "Banco de dados padrão não encontrado. Deseja criar um agora?" #: src/Gui/MainWindow.cs:215 msgid "Unsupported database version" msgstr "Não há suporte para esta versão do banco de dados." #: src/Gui/MainWindow.cs:216 msgid "This database version is not supported." msgstr "Não há suporte para esta versão do banco de dados." #: src/Gui/MainWindow.cs:235 #, csharp-format msgid "{0} volumes loaded." msgstr "{0} volumes carregados." #: src/Gui/MainWindow.cs:256 #, csharp-format msgid "An error occured while loading the volume list: {0}" msgstr "" "Ocorreu um erro enquanto estava sendo carregada a lista de volumes: {0}" #: src/Gui/MainWindow.cs:300 msgid "Please enter the name for the new database" msgstr "Por favor forneça um nome para o novo banco de dados" #: src/Gui/MainWindow.cs:312 msgid "Database exists" msgstr "Banco de dados existente" #: src/Gui/MainWindow.cs:313 msgid "Database already exists. Overwrite?" msgstr "Banco de dados já existente. Sobrescrever?" #: src/Gui/MainWindow.cs:326 msgid "Please select a database" msgstr "Por favor escolha um banco de dados" #: src/Gui/MainWindow.cs:335 src/Gui/Import.cs:83 msgid "Database not found." msgstr "Banco de dados não encontrado." #: src/Gui/MainWindow.cs:356 #, csharp-format msgid "" "An error occured while accessing drive {0}:\n" "{1}" msgstr "" "Ocorreu um erro durante o acesso a unidade {0}:\n" "{1}" #: src/Gui/MainWindow.cs:378 #, csharp-format msgid "Drive {0} is not ready." msgstr "Unidade {0} não está pronta." #: src/Gui/MainWindow.cs:387 #, csharp-format msgid "Drive {0} is neither mounted nor does it contain an audio cd." msgstr "A unidade {0} não está montada nem contém um cd de áudio." #: src/Gui/MainWindow.cs:406 msgid "Confirmation" msgstr "Confirmação" #: src/Gui/MainWindow.cs:407 msgid "Are you sure you really want to remove the selected volume?" msgstr "Você tem certeza de que deseja remover o volume selecionado?" #: src/Gui/MainWindow.cs:712 #, csharp-format msgid "Please insert volume '{0}'." msgstr "" #: src/Gui/MainWindow.cs:714 msgid "Waiting for volume" msgstr "" #: src/Gui/MainWindow.cs:966 msgid "Add Volume" msgstr "" #: src/Gui/MainWindow.cs:970 msgid "Search" msgstr "" #: src/Gui/MainWindow.cs:973 msgid "App Menu" msgstr "" #: src/Gui/MainWindow.cs:979 msgid "_New Database" msgstr "_Novo banco de dados" #: src/Gui/MainWindow.cs:982 msgid "_Open Database" msgstr "Abrir _banco de dados" #: src/Gui/MainWindow.cs:985 msgid "Open Default Database" msgstr "Abrir banco de dados padrão" #: src/Gui/MainWindow.cs:991 msgid "Recent Databases" msgstr "Bancos de dados recentes" #: src/Gui/MainWindow.cs:998 msgid "_Import" msgstr "Impor_tar" #: src/Gui/MainWindow.cs:1001 msgid "_Preferences" msgstr "_Preferências" #: src/Gui/MainWindow.cs:1004 msgid "_Database Properties" msgstr "Propriedades do banco de _dados" #: src/Gui/MainWindow.cs:1007 msgid "Info" msgstr "" #: src/Gui/MainWindow.cs:1010 msgid "_Quit" msgstr "_Sair" #: src/Gui/MainWindow.cs:1016 msgid "_Edit Volume" msgstr "Editar volume de _mídia" #: src/Gui/MainWindow.cs:1019 msgid "_Remove Volume" msgstr "_Remover Volume de Mídia" #: src/Gui/MainWindow.cs:1022 msgid "Rescan Volume" msgstr "" #: src/Gui/MainWindow.cs:1034 msgid "Sort by" msgstr "Ordenar por" #: src/Gui/MainWindow.cs:1037 msgid "Descending" msgstr "Descendente" #: src/Gui/MainWindow.cs:1043 msgid "Date added" msgstr "Data de criação" #: src/Gui/MainWindow.cs:1044 msgid "Title" msgstr "Título" #: src/Gui/MainWindow.cs:1045 msgid "Drivetype" msgstr "Tipo de unidade" #: src/Gui/MainWindow.cs:1142 msgid "Filter volumes" msgstr "Filtrar volumes de mídia" #: src/Gui/Import.cs:29 msgid "Import" msgstr "Importar" #: src/Gui/Import.cs:30 msgid "Abort" msgstr "Cancelar" #: src/Gui/Import.cs:31 msgid "Please select a database." msgstr "" #: src/Gui/Import.cs:72 #, csharp-format msgid "{0:0}% completed." msgstr "{0:0}% completados." #: src/Gui/Import.cs:82 msgid "Import failed" msgstr "Falha ao importar" #: src/Gui/Import.cs:85 msgid "Import failed!" msgstr "Falha ao importar!" #: src/Gui/Import.cs:87 msgid "Import aborted." msgstr "Importação cancelada." #: src/Gui/Import.cs:89 msgid "Import completed successfully." msgstr "Importação completada com sucesso." #: src/Gui/Import.cs:121 msgid "Import in progress" msgstr "Importação em andamento" #: src/Gui/Import.cs:122 msgid "You must stop the import before closing this window." msgstr "Você deve interromper a importação antes de fechar esta janela." #: src/Gui/Import.cs:148 msgid "Unknown format." msgstr "" #: src/Gui/Import.cs:175 msgid "Import Database" msgstr "Importar banco de dados" #: src/Gui/Import.cs:186 msgid "Please select a database to import" msgstr "Por favor selecione um banco de dados para importação" #: src/Gui/Import.cs:194 msgid "All supported formats" msgstr "" #: src/Gui/Import.cs:198 #, csharp-format msgid ".{0} files" msgstr "" #: src/Gui/Import.cs:209 msgid "Database:" msgstr "Banco de dados:" #: src/Gui/Import.cs:210 msgid "Format:" msgstr "Formato:" #: src/Gui/ItemProperties.cs:29 msgid "Item Properties" msgstr "Propriedades do item" #: src/Gui/VolumeScanner.cs:116 msgid "Scanning started." msgstr "Iniciando o escaneamento." #: src/Gui/VolumeScanner.cs:118 #, csharp-format msgid "Scanning of drive '{0}' started." msgstr "Iniciando o escaneamento da unidade '{0}'." #: src/Gui/VolumeScanner.cs:124 #, csharp-format msgid "" "Options: generate thumbs: {0}, extract metadata: {1}, discard symlinks: {2}, " "hashing: {3}." msgstr "" "Preferências: gerar miniaturas: {0}, extrair metadados: {1}, descartar links " "simbólicos: {2}, criar códigos de hash: {3}." #: src/Gui/VolumeScanner.cs:131 #, csharp-format msgid "Options: MusicBrainz enabled: {0}" msgstr "Preferências: MusicBrainz ativado: {0}" #: src/Gui/VolumeScanner.cs:157 msgid "Time" msgstr "Hora" #: src/Gui/VolumeScanner.cs:161 msgid "Message" msgstr "Mensagem" #: src/Gui/VolumeScanner.cs:258 msgid "Stopping Scanner and performing rollback..." msgstr "Interrompendo escaneamento e desfazendo as alterações..." #: src/Gui/VolumeScanner.cs:268 msgid "yes" msgstr "sim" #: src/Gui/VolumeScanner.cs:268 msgid "no" msgstr "não" #: src/Gui/VolumeScanner.cs:291 msgid "Scan in progress" msgstr "Escaneamento em andamento" #: src/Gui/VolumeScanner.cs:291 msgid "You must stop scanning before closing this window." msgstr "Você deve interromper o escaneamento antes de fechar esta janela." #: src/Gui/VolumeScanner.cs:346 #, csharp-format msgid "An unhandled exception occured ({0})." msgstr "Ocorreu uma exceção que não pôde ser resolvida ({0})." #: src/Gui/VolumeScanner.cs:347 msgid "All database changes have been rolled back." msgstr "Todas as alterações nos bancos de dados foram desfeitas." #: src/Gui/VolumeScanner.cs:354 #, csharp-format msgid "Scanning failed. Reason: an unhandled exception occured ({0})." msgstr "" "O escaneamento falhou. Motivo: ocorreu uma exceção que não pôde ser " "resolvida ({0})." #: src/Gui/VolumeScanner.cs:356 msgid "Scanning aborted." msgstr "Escaneamento cancelado." #: src/Gui/VolumeScanner.cs:358 msgid "Scanning completed successfully." msgstr "Escaneamento finalizado com sucesso." #: src/Gui/VolumeScanner.cs:488 msgid "VolumeScanner" msgstr "Escaneador de volumes de mídia" #: src/Gui/VolumeScanner.cs:500 msgid "Volume Information:" msgstr "Informações do volume de mídia:" #: src/Gui/VolumeScanner.cs:510 msgid "Scanner Log:" msgstr "Registro de escaneamento:" #: src/Gui/VolumeScanner.cs:527 msgid "Database access" msgstr "Acesso ao banco de dados" #: src/Gui/Preferences.cs:119 msgid "None" msgstr "Nenhum" #: src/Gui/Preferences.cs:228 msgid "Unsupported theme" msgstr "Não há suporte a este tema" #: src/Gui/Preferences.cs:229 msgid "The selected icon theme is currently not supported on your system." msgstr "Não há suporte para o tema de ícones selecionado no sistema." #: src/Gui/Preferences.cs:267 msgid "Restart required" msgstr "Reinicialização requerida" #: src/Gui/Preferences.cs:268 #, csharp-format msgid "You must restart {0} for icontheme changes to take effect." msgstr "" "Você deve reinicializar {0} para que a alteração no tema dos ícones entre em " "efeito." #: src/Gui/Preferences.cs:298 msgid "Preferences" msgstr "Preferências" #: src/Gui/Preferences.cs:322 msgid "_Load Defaults" msgstr "_Carregar configurações padrão" #: src/Gui/Preferences.cs:349 msgid "Icon theme:" msgstr "Tema dos ícones:" #: src/Gui/Preferences.cs:355 msgid "Reopen most recent database on startup" msgstr "Abrir novamente o banco de dados mais recente durante inicialização" #: src/Gui/Preferences.cs:359 msgid "Show iteminfo panel" msgstr "Mostrar painel de informações dos itens" #: src/Gui/Preferences.cs:363 msgid "Show hidden files" msgstr "Exibir arquivos ocultos" #: src/Gui/Preferences.cs:367 msgid "Show thumbnails in the filebrowser" msgstr "Mostre miniaturas no visualizador de arquivos" #: src/Gui/Preferences.cs:370 msgid "General" msgstr "Geral" #: src/Gui/Preferences.cs:378 msgid "Don't prompt, always scan:" msgstr "Não pergunte, sempre realize o escaneamento:" #: src/Gui/Preferences.cs:397 msgid "Generate Thumbnails" msgstr "Gerar miniaturas" #: src/Gui/Preferences.cs:401 msgid "Extract metadata" msgstr "Extrair metadados" #: src/Gui/Preferences.cs:405 msgid "Discard symbolic links" msgstr "Descarte links simbólicos" #: src/Gui/Preferences.cs:409 msgid "Compute hashcodes for files (slow!)" msgstr "Calcule hashcodes para os arquivos (lento!)" #: src/Gui/Preferences.cs:413 msgid "Fetch audio cd metadata from MusicBrainz.org" msgstr "Contactar MusicBrainz.org para obter metadados de cds de áudio" #: src/Gui/Preferences.cs:416 msgid "Scanner" msgstr "Escaneamento" Basenji/po/pl.po0000664000175000017500000005171412067326706013721 0ustar patrickpatrick# Polish translation for basenji # Copyright (c) 2010 Rosetta Contributors and Canonical Ltd 2010 # This file is distributed under the same license as the basenji package. # FIRST AUTHOR , 2010. # msgid "" msgstr "" "Project-Id-Version: basenji\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2012-07-15 15:49+0200\n" "PO-Revision-Date: 2012-04-12 09:44+0000\n" "Last-Translator: axel \n" "Language-Team: Polish \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2012-10-27 11:00+0000\n" "X-Generator: Launchpad (build 16194)\n" #: src/Util.cs:30 #, csharp-format msgid "{0} Bytes" msgstr "{0} Bajtów" #: src/Util.cs:32 msgid "Bytes" msgstr "Bajtów" #: src/Util.cs:32 msgid "KB" msgstr "KB" #: src/Util.cs:32 msgid "MB" msgstr "MB" #: src/Util.cs:32 msgid "GB" msgstr "GB" #: src/Util.cs:32 msgid "TB" msgstr "TB" #: src/Options.cs:477 msgid "OptionName" msgstr "Opcjonalna nazwa" #: src/FileDialog.cs:51 msgid "VolumeDatabase files" msgstr "Pliki baz danych woluminu" #: src/FileDialog.cs:56 msgid "All files" msgstr "Wszystkie pliki" #: src/Main.cs:142 src/Gui/MainWindow.cs:76 src/Gui/MainWindow.cs:92 #: src/Gui/MainWindow.cs:334 src/Gui/MainWindow.cs:355 #: src/Gui/MainWindow.cs:377 src/Gui/MainWindow.cs:386 #: src/Gui/MainWindow.cs:635 msgid "Error" msgstr "Błąd" #: src/Main.cs:142 #, csharp-format msgid "{0} is already running." msgstr "{0} już jest uruchomione." #: src/Gui/Widgets/VolumeView.cs:42 src/Gui/Widgets/SearchResultView.cs:30 msgid "Unnamed" msgstr "Bez nazwy" #: src/Gui/Widgets/VolumeView.cs:43 #: src/Gui/Widgets/Editors/VolumeEditor.cs:259 msgid "Category:" msgstr "Kategoria:" #: src/Gui/Widgets/VolumeView.cs:44 msgid "files" msgstr "plików" #: src/Gui/Widgets/VolumeView.cs:45 msgid "tracks" msgstr "utworów" #: src/Gui/Widgets/ItemView.cs:29 msgid "Loading..." msgstr "Wczytywanie..." #: src/Gui/Widgets/ItemView.cs:30 msgid "(empty)" msgstr "(pusta)" #: src/Gui/Widgets/ItemView.cs:99 src/Gui/DriveSelection.cs:80 msgid "Unknown" msgstr "Nieznany" #: src/Gui/Widgets/ItemView.cs:170 src/Gui/Widgets/Editors/ItemEditor.cs:96 msgid "Name" msgstr "Nazwa" #: src/Gui/Widgets/ItemView.cs:176 msgid "Artist" msgstr "Wykonawca" #: src/Gui/Widgets/ItemView.cs:181 #: src/Gui/Widgets/Editors/AudioTrackItemEditor.cs:53 #: src/Gui/Widgets/ItemInfo.cs:225 src/Gui/Widgets/ItemInfo.cs:288 msgid "Duration" msgstr "Długość" #: src/Gui/Widgets/Editors/FileSystemVolumeEditor.cs:34 #: src/Gui/DriveSelection.cs:168 msgid "Filesystem" msgstr "System plików" #: src/Gui/Widgets/Editors/FileSystemVolumeEditor.cs:65 msgid "Files:" msgstr "Pliki:" #: src/Gui/Widgets/Editors/FileSystemVolumeEditor.cs:66 msgid "Directories:" msgstr "Katalogi:" #: src/Gui/Widgets/Editors/FileSystemVolumeEditor.cs:67 msgid "Total size:" msgstr "Rozmiar całkowity:" #: src/Gui/Widgets/Editors/ItemEditor.cs:95 msgid "Item type" msgstr "Typ elementu" #: src/Gui/Widgets/Editors/ItemEditor.cs:111 src/Gui/Widgets/ItemInfo.cs:371 msgid "Note" msgstr "Uwaga" #: src/Gui/Widgets/Editors/ItemEditor.cs:112 src/Gui/Widgets/ItemInfo.cs:374 msgid "Keywords" msgstr "Słowa kluczowe" #: src/Gui/Widgets/Editors/AudioTrackItemEditor.cs:31 #: src/Gui/Widgets/SearchResultView.cs:34 msgid "Audio CD track" msgstr "Ścieżka Audio CD" #: src/Gui/Widgets/Editors/AudioTrackItemEditor.cs:54 #: src/Gui/Widgets/ItemInfo.cs:230 msgid "Type" msgstr "Typ" #: src/Gui/Widgets/Editors/DirectoryItemEditor.cs:28 msgid "Directory" msgstr "Katalog" #: src/Gui/Widgets/Editors/FileSystemItemEditor.cs:59 #: src/Gui/Widgets/SearchResultView.cs:31 src/Gui/Widgets/ItemInfo.cs:183 msgid "Location" msgstr "Położenie" #: src/Gui/Widgets/Editors/FileSystemItemEditor.cs:60 #: src/Gui/Widgets/ItemInfo.cs:185 msgid "Last write time" msgstr "Data ostatniego zapisu" #: src/Gui/Widgets/Editors/FileSystemItemEditor.cs:61 #: src/Gui/Widgets/ItemInfo.cs:210 msgid "Filetype" msgstr "Typ pliku" #: src/Gui/Widgets/Editors/FileItemEditor.cs:31 msgid "File" msgstr "Plik" #: src/Gui/Widgets/Editors/FileItemEditor.cs:52 #: src/Gui/Widgets/ItemInfo.cs:204 src/Gui/Widgets/ItemInfo.cs:226 #: src/Gui/DriveSelection.cs:148 msgid "Size" msgstr "Rozmiar" #: src/Gui/Widgets/Editors/FileItemEditor.cs:53 #: src/Gui/Widgets/ItemInfo.cs:206 msgid "Hash" msgstr "Hash" #: src/Gui/Widgets/Editors/AudioCdVolumeEditor.cs:33 msgid "Audio CD" msgstr "Płyta CD Audio" #: src/Gui/Widgets/Editors/AudioCdVolumeEditor.cs:63 msgid "Tracks:" msgstr "Ścieżki:" #: src/Gui/Widgets/Editors/AudioCdVolumeEditor.cs:64 msgid "Duration:" msgstr "Czas trwania:" #: src/Gui/Widgets/Editors/VolumeEditor.cs:45 msgid "Backup" msgstr "Kopia zapasowa" #: src/Gui/Widgets/Editors/VolumeEditor.cs:46 #: src/Gui/Widgets/CategoryView.cs:60 msgid "Documents" msgstr "Dokumenty" #: src/Gui/Widgets/Editors/VolumeEditor.cs:47 #: src/Gui/Widgets/CategoryView.cs:61 msgid "Music" msgstr "Muzyka" #: src/Gui/Widgets/Editors/VolumeEditor.cs:48 msgid "Audiobooks" msgstr "Audiobooki" #: src/Gui/Widgets/Editors/VolumeEditor.cs:49 #: src/Gui/Widgets/CategoryView.cs:62 msgid "Movies" msgstr "Filmy" #: src/Gui/Widgets/Editors/VolumeEditor.cs:50 msgid "Videos" msgstr "Wideo" #: src/Gui/Widgets/Editors/VolumeEditor.cs:51 msgid "Pictures" msgstr "Obrazy" #: src/Gui/Widgets/Editors/VolumeEditor.cs:52 msgid "Games" msgstr "Gry" #: src/Gui/Widgets/Editors/VolumeEditor.cs:53 src/Gui/Widgets/ItemInfo.cs:319 msgid "Software" msgstr "Oprogramowanie" #: src/Gui/Widgets/Editors/VolumeEditor.cs:54 msgid "Misc" msgstr "Różne" #: src/Gui/Widgets/Editors/VolumeEditor.cs:55 msgid "Other" msgstr "Inne" #: src/Gui/Widgets/Editors/VolumeEditor.cs:225 msgid "Yes" msgstr "Tak" #: src/Gui/Widgets/Editors/VolumeEditor.cs:225 msgid "No" msgstr "Nie" #: src/Gui/Widgets/Editors/VolumeEditor.cs:235 msgid "Volume type:" msgstr "Typ woluminu:" #: src/Gui/Widgets/Editors/VolumeEditor.cs:236 msgid "Hashed:" msgstr "Shashowane:" #: src/Gui/Widgets/Editors/VolumeEditor.cs:237 msgid "Added:" msgstr "Dodano:" #: src/Gui/Widgets/Editors/VolumeEditor.cs:258 msgid "Archive No.:" msgstr "Archiwum nr:" #: src/Gui/Widgets/Editors/VolumeEditor.cs:260 msgid "Title:" msgstr "Tytuł:" #: src/Gui/Widgets/Editors/VolumeEditor.cs:261 src/Gui/DBProperties.cs:98 msgid "Description:" msgstr "Opis:" #: src/Gui/Widgets/Editors/VolumeEditor.cs:262 msgid "Keywords:" msgstr "Słowa kluczowe:" #: src/Gui/Widgets/Editors/VolumeEditor.cs:263 msgid "Loaned to:" msgstr "Pożyczone od:" #: src/Gui/Widgets/Editors/VolumeEditor.cs:264 msgid "Loaned date:" msgstr "Data pożyczenia:" #: src/Gui/Widgets/Editors/VolumeEditor.cs:265 msgid "Return date:" msgstr "Data oddania:" #: src/Gui/Widgets/CategoryView.cs:58 msgid "Directories" msgstr "Katalogi" #: src/Gui/Widgets/CategoryView.cs:59 msgid "Text" msgstr "Tekst" #: src/Gui/Widgets/CategoryView.cs:63 msgid "Images" msgstr "Obrazy" #: src/Gui/Widgets/CategoryView.cs:64 msgid "Applications" msgstr "Programy" #: src/Gui/Widgets/CategoryView.cs:65 msgid "Archives" msgstr "Archiwa" #: src/Gui/Widgets/CategoryView.cs:66 msgid "Development" msgstr "Narzędzia programistyczne" #: src/Gui/Widgets/CategoryView.cs:96 src/Gui/MainWindow.cs:1046 msgid "Category" msgstr "Kategoria" #: src/Gui/Widgets/CategoryView.cs:128 msgid "All items" msgstr "Wszystkie elementy" #: src/Gui/Widgets/SearchResultView.cs:32 msgid "Volume" msgstr "Wolumin" #: src/Gui/Widgets/SearchResultView.cs:33 src/Gui/MainWindow.cs:1040 msgid "Archive No." msgstr "Archiwum nr:" #: src/Gui/Widgets/ItemInfo.cs:40 msgid "by" msgstr "przez" #: src/Gui/Widgets/ItemInfo.cs:41 msgid "from" msgstr "z" #: src/Gui/Widgets/ItemInfo.cs:196 msgid "Symlink target" msgstr "Cel dowiązania" #: src/Gui/Widgets/ItemInfo.cs:227 msgid "Track No." msgstr "Ścieżka nr" #: src/Gui/Widgets/ItemInfo.cs:258 msgid "Genre" msgstr "Gatunek" #: src/Gui/Widgets/ItemInfo.cs:278 msgid "Year" msgstr "Rok" #: src/Gui/Widgets/ItemInfo.cs:283 msgid "Description" msgstr "Opis" #: src/Gui/Widgets/ItemInfo.cs:294 msgid "Dimensions" msgstr "Wymiary" #: src/Gui/Widgets/ItemInfo.cs:299 msgid "Format" msgstr "Format" #: src/Gui/Widgets/ItemInfo.cs:303 msgid "Author" msgstr "Autor" #: src/Gui/Widgets/ItemInfo.cs:307 msgid "Copyright" msgstr "Copyright" #: src/Gui/Widgets/ItemInfo.cs:311 msgid "Producer" msgstr "Producent" #: src/Gui/Widgets/ItemInfo.cs:315 msgid "Creator" msgstr "Twórca" #: src/Gui/Widgets/ItemInfo.cs:323 msgid "Language" msgstr "Język" #: src/Gui/Widgets/ItemInfo.cs:327 msgid "Page count" msgstr "Liczba stron" #: src/Gui/Widgets/ItemInfo.cs:346 msgid "File count" msgstr "Liczba plików" #: src/Gui/Widgets/PageNavigation.cs:27 msgid "No items." msgstr "Brak elementów." #: src/Gui/Widgets/PageNavigation.cs:145 #, csharp-format msgid "Page {0}/{1} ({2} - {3} of {4} items)" msgstr "Strona {0}/{1} ({2} - {3} z {4} elementów)" #: src/Gui/ObjectProperties.cs:54 src/Gui/VolumeScanner.cs:248 msgid "Invalid data" msgstr "Niepoprawne dane" #: src/Gui/ObjectProperties.cs:54 src/Gui/VolumeScanner.cs:249 #, csharp-format msgid "" "\"{0}\" is {1}.\n" "\n" "Expected format: {2}\n" "Please correct or remove the data you entered." msgstr "" "\"{0}\" to {1}.\n" "\n" "Spodziewany format: {2}\n" "Proszę poprawić lub usunąć podane dane." #: src/Gui/DBProperties.cs:85 msgid "Database Properties" msgstr "Właściwości bazy" #: src/Gui/DBProperties.cs:97 msgid "Name:" msgstr "Nazwa:" #: src/Gui/DBProperties.cs:99 msgid "Created:" msgstr "Utworzony:" #: src/Gui/VolumeProperties.cs:29 msgid "Volume Properties" msgstr "Właściwości woluminu" #: src/Gui/DriveSelection.cs:60 msgid "Waiting for drives..." msgstr "Oczekiwanie na napędy..." #: src/Gui/DriveSelection.cs:133 msgid "Drive" msgstr "Napęd" #: src/Gui/DriveSelection.cs:139 msgid "Label" msgstr "Etykieta" #: src/Gui/DriveSelection.cs:241 msgid "Please select a drive to scan" msgstr "Proszę wybrać napęd do przeskanowania" #: src/Gui/About.cs:28 msgid "A cross-platform media indexing/search tool." msgstr "" #: src/Gui/About.cs:29 #, csharp-format msgid "Using VolumeDB v{0}." msgstr "Używanie VolumeDB w wersji {0}." #: src/Gui/About.cs:31 msgid "Copyright (c) " msgstr "Copyright (c) " #: src/Gui/ItemSearch.cs:81 #, csharp-format msgid "Found {0} items in {1:F3} seconds." msgstr "Znaleziono {0} elementów w {1:F3} sekund." #: src/Gui/ItemSearch.cs:92 src/Gui/MainWindow.cs:519 msgid "Timeout: another search is probably still in progress." msgstr "Oczekiwanie: prawdopodobnie wciąż działa inny proces wyszukiwania." #: src/Gui/ItemSearch.cs:94 msgid "Too many search results. Please refine your search criteria." msgstr "Zbyt dużo wyników wyszukiwania. Proszę zredefiniować kryteria." #: src/Gui/ItemSearch.cs:112 src/Gui/MainWindow.cs:535 msgid "Searching..." msgstr "Wyszukiwanie..." #: src/Gui/ItemSearch.cs:267 msgid "Search Items" msgstr "Elementy Wyszukiwania" #: src/Gui/ItemSearch.cs:279 src/Gui/MainWindow.cs:1145 msgid "default" msgstr "domyślne" #: src/Gui/ItemSearch.cs:283 msgid "Search items" msgstr "Szukaj przedmiotów" #: src/Gui/ItemSearch.cs:318 msgid "Quick tip:" msgstr "" #: src/Gui/ItemSearch.cs:319 #, csharp-format msgid "" "Click on the icon to the left of the search field to build advanced search " "queries.\n" "Example: {0}" msgstr "" #: src/Gui/ItemSearch.cs:326 msgid "No search results." msgstr "Brak wyników wyszukiwania." #: src/Gui/ItemSearch.cs:375 src/Gui/MainWindow.cs:1028 msgid "Edit Item" msgstr "Edytuj element" #: src/Gui/ItemSearch.cs:382 msgid "Show in Main Window" msgstr "" #: src/Gui/MainWindow.cs:77 src/Gui/MainWindow.cs:93 src/Gui/MainWindow.cs:635 #, csharp-format msgid "Database '{0}' not found." msgstr "Baza '{0}' nie została znaleziona." #: src/Gui/MainWindow.cs:185 msgid "Database not found" msgstr "Baza nie znaleziona." #: src/Gui/MainWindow.cs:186 msgid "Default database not found. Create?" msgstr "Domyślna baza danych nie została znaleziona. Utworzyć nową?" #: src/Gui/MainWindow.cs:215 msgid "Unsupported database version" msgstr "Nieobsługiwana wersja bazy danych" #: src/Gui/MainWindow.cs:216 msgid "This database version is not supported." msgstr "Ta wersja bazy danych nie jest obsługiwana." #: src/Gui/MainWindow.cs:235 #, csharp-format msgid "{0} volumes loaded." msgstr "Załadowano {0} woluminów." #: src/Gui/MainWindow.cs:256 #, csharp-format msgid "An error occured while loading the volume list: {0}" msgstr "Wystąpił błąd w czasie ładowania listy woluminów: {0}" #: src/Gui/MainWindow.cs:300 msgid "Please enter the name for the new database" msgstr "Proszę wprowadzić nazwę dla nowej bazy danych" #: src/Gui/MainWindow.cs:312 msgid "Database exists" msgstr "Baza danych istnieje" #: src/Gui/MainWindow.cs:313 msgid "Database already exists. Overwrite?" msgstr "Baza danych już istnieje. Zastąpić?" #: src/Gui/MainWindow.cs:326 msgid "Please select a database" msgstr "Proszę wybrać bazę danych" #: src/Gui/MainWindow.cs:335 src/Gui/Import.cs:83 msgid "Database not found." msgstr "Baza danych nie znaleziona." #: src/Gui/MainWindow.cs:356 #, csharp-format msgid "" "An error occured while accessing drive {0}:\n" "{1}" msgstr "" "Wystąpił błąd podczas czytania napędu {0}:\n" "{1}" #: src/Gui/MainWindow.cs:378 #, csharp-format msgid "Drive {0} is not ready." msgstr "Napęd {0} nie jest gotowy." #: src/Gui/MainWindow.cs:387 #, csharp-format msgid "Drive {0} is neither mounted nor does it contain an audio cd." msgstr "Napęd {0} nie jest zamontowany lub zawiera płytę audio." #: src/Gui/MainWindow.cs:406 msgid "Confirmation" msgstr "Potwierdzenie" #: src/Gui/MainWindow.cs:407 msgid "Are you sure you really want to remove the selected volume?" msgstr "Czy jesteś pewny, że chcesz usunąć ten wolumin?" #: src/Gui/MainWindow.cs:712 #, csharp-format msgid "Please insert volume '{0}'." msgstr "" #: src/Gui/MainWindow.cs:714 msgid "Waiting for volume" msgstr "" #: src/Gui/MainWindow.cs:966 msgid "Add Volume" msgstr "" #: src/Gui/MainWindow.cs:970 msgid "Search" msgstr "" #: src/Gui/MainWindow.cs:973 msgid "App Menu" msgstr "" #: src/Gui/MainWindow.cs:979 msgid "_New Database" msgstr "_Nowa baza danych" #: src/Gui/MainWindow.cs:982 msgid "_Open Database" msgstr "_Otwórz bazę danych" #: src/Gui/MainWindow.cs:985 msgid "Open Default Database" msgstr "Otwórz domyślną bazę danych" #: src/Gui/MainWindow.cs:991 msgid "Recent Databases" msgstr "Ostatnio używane bazy danych" #: src/Gui/MainWindow.cs:998 msgid "_Import" msgstr "_Importuj" #: src/Gui/MainWindow.cs:1001 msgid "_Preferences" msgstr "_Preferencje" #: src/Gui/MainWindow.cs:1004 msgid "_Database Properties" msgstr "Właściwości bazy _danych" #: src/Gui/MainWindow.cs:1007 msgid "Info" msgstr "" #: src/Gui/MainWindow.cs:1010 msgid "_Quit" msgstr "Zakończ" #: src/Gui/MainWindow.cs:1016 msgid "_Edit Volume" msgstr "_Edytuj wolumin" #: src/Gui/MainWindow.cs:1019 msgid "_Remove Volume" msgstr "Usuń wolumin" #: src/Gui/MainWindow.cs:1022 msgid "Rescan Volume" msgstr "" #: src/Gui/MainWindow.cs:1034 msgid "Sort by" msgstr "Sortuj wg" #: src/Gui/MainWindow.cs:1037 msgid "Descending" msgstr "Malejąco" #: src/Gui/MainWindow.cs:1043 msgid "Date added" msgstr "Data dodania" #: src/Gui/MainWindow.cs:1044 msgid "Title" msgstr "Tytuł" #: src/Gui/MainWindow.cs:1045 msgid "Drivetype" msgstr "Typ napędu" #: src/Gui/MainWindow.cs:1142 msgid "Filter volumes" msgstr "Filtruj woluminy" #: src/Gui/Import.cs:29 msgid "Import" msgstr "Importuj" #: src/Gui/Import.cs:30 msgid "Abort" msgstr "Przerwij" #: src/Gui/Import.cs:31 msgid "Please select a database." msgstr "" #: src/Gui/Import.cs:72 #, csharp-format msgid "{0:0}% completed." msgstr "Skończono {0:0}%." #: src/Gui/Import.cs:82 msgid "Import failed" msgstr "Importowanie nie powiodło się" #: src/Gui/Import.cs:85 msgid "Import failed!" msgstr "Importowanie nie powiodło się!" #: src/Gui/Import.cs:87 msgid "Import aborted." msgstr "Importowanie przerwane." #: src/Gui/Import.cs:89 msgid "Import completed successfully." msgstr "Importowanie zakończone." #: src/Gui/Import.cs:121 msgid "Import in progress" msgstr "Importowanie trwa" #: src/Gui/Import.cs:122 msgid "You must stop the import before closing this window." msgstr "Musisz przerwać proces importu, by zamknąć to okno." #: src/Gui/Import.cs:148 msgid "Unknown format." msgstr "" #: src/Gui/Import.cs:175 msgid "Import Database" msgstr "Importuj bazę danych" #: src/Gui/Import.cs:186 msgid "Please select a database to import" msgstr "Proszę wybrać bazę danych do zaimportowania" #: src/Gui/Import.cs:194 msgid "All supported formats" msgstr "" #: src/Gui/Import.cs:198 #, csharp-format msgid ".{0} files" msgstr "" #: src/Gui/Import.cs:209 msgid "Database:" msgstr "Baza danych:" #: src/Gui/Import.cs:210 msgid "Format:" msgstr "Format:" #: src/Gui/ItemProperties.cs:29 msgid "Item Properties" msgstr "Właściwości elementu" #: src/Gui/VolumeScanner.cs:116 msgid "Scanning started." msgstr "Skanowanie rozpoczęte." #: src/Gui/VolumeScanner.cs:118 #, csharp-format msgid "Scanning of drive '{0}' started." msgstr "Skanowanie napędy '{0}' rozpoczęte." #: src/Gui/VolumeScanner.cs:124 #, csharp-format msgid "" "Options: generate thumbs: {0}, extract metadata: {1}, discard symlinks: {2}, " "hashing: {3}." msgstr "" "Opcje: generuj miniatury: {0}, pobierz metadane: {1}, usuń dowiązania: {2}, " "hashuj: {3}." #: src/Gui/VolumeScanner.cs:131 #, csharp-format msgid "Options: MusicBrainz enabled: {0}" msgstr "Opcje: MusicBrainz aktywny: {0}" #: src/Gui/VolumeScanner.cs:157 msgid "Time" msgstr "Czas" #: src/Gui/VolumeScanner.cs:161 msgid "Message" msgstr "Wiadomość" #: src/Gui/VolumeScanner.cs:258 msgid "Stopping Scanner and performing rollback..." msgstr "Zatrzymywanie Skanera i cofanie się..." #: src/Gui/VolumeScanner.cs:268 msgid "yes" msgstr "tak" #: src/Gui/VolumeScanner.cs:268 msgid "no" msgstr "nie" #: src/Gui/VolumeScanner.cs:291 msgid "Scan in progress" msgstr "Skanowanie trwa" #: src/Gui/VolumeScanner.cs:291 msgid "You must stop scanning before closing this window." msgstr "Musisz przerwać proces skanowania przed zamknięciem tego okna." #: src/Gui/VolumeScanner.cs:346 #, csharp-format msgid "An unhandled exception occured ({0})." msgstr "Wystąpił nieobsługiwany wyjątek ({0})." #: src/Gui/VolumeScanner.cs:347 msgid "All database changes have been rolled back." msgstr "Wszystkie zmiany w bazie zostały cofnięte." #: src/Gui/VolumeScanner.cs:354 #, csharp-format msgid "Scanning failed. Reason: an unhandled exception occured ({0})." msgstr "Skanowanie nie powiodło się: wystąpił nieobsługiwany wyjątek ({0})." #: src/Gui/VolumeScanner.cs:356 msgid "Scanning aborted." msgstr "Skanowanie przerwane." #: src/Gui/VolumeScanner.cs:358 msgid "Scanning completed successfully." msgstr "Skanowanie skończone." #: src/Gui/VolumeScanner.cs:488 msgid "VolumeScanner" msgstr "Skaner woluminów" #: src/Gui/VolumeScanner.cs:500 msgid "Volume Information:" msgstr "Informacje o woluminie:" #: src/Gui/VolumeScanner.cs:510 msgid "Scanner Log:" msgstr "Dziennik Skanera:" #: src/Gui/VolumeScanner.cs:527 msgid "Database access" msgstr "Dostęp do bazy danych" #: src/Gui/Preferences.cs:119 msgid "None" msgstr "Brak" #: src/Gui/Preferences.cs:228 msgid "Unsupported theme" msgstr "Nieobługiwany motyw" #: src/Gui/Preferences.cs:229 msgid "The selected icon theme is currently not supported on your system." msgstr "Wybrany motyw ikon jest obecnie nie obsługiwany przez twój system." #: src/Gui/Preferences.cs:267 msgid "Restart required" msgstr "Wymagane ponowne uruchomienie" #: src/Gui/Preferences.cs:268 #, csharp-format msgid "You must restart {0} for icontheme changes to take effect." msgstr "" "Musisz zrestartować {0} aby zmiany w zestawie ikony zostały zastosowane." #: src/Gui/Preferences.cs:298 msgid "Preferences" msgstr "Preferencje" #: src/Gui/Preferences.cs:322 msgid "_Load Defaults" msgstr "Wczytaj domyś_lne" #: src/Gui/Preferences.cs:349 msgid "Icon theme:" msgstr "Zestaw ikon:" #: src/Gui/Preferences.cs:355 msgid "Reopen most recent database on startup" msgstr "Otwórz ostatnią bazę danych przy uruchomieniu" #: src/Gui/Preferences.cs:359 msgid "Show iteminfo panel" msgstr "Pokaż panel informacji o przedmiocie" #: src/Gui/Preferences.cs:363 msgid "Show hidden files" msgstr "Wyświetlanie ukrytych plików" #: src/Gui/Preferences.cs:367 msgid "Show thumbnails in the filebrowser" msgstr "Pokaż miniaturki w przeglądarce plików" #: src/Gui/Preferences.cs:370 msgid "General" msgstr "Ogólne" #: src/Gui/Preferences.cs:378 msgid "Don't prompt, always scan:" msgstr "Nie pytaj, zawsze skanuj:" #: src/Gui/Preferences.cs:397 msgid "Generate Thumbnails" msgstr "Generuj miniaturki" #: src/Gui/Preferences.cs:401 msgid "Extract metadata" msgstr "Pobierz metadane" #: src/Gui/Preferences.cs:405 msgid "Discard symbolic links" msgstr "Usuń dowiązania" #: src/Gui/Preferences.cs:409 msgid "Compute hashcodes for files (slow!)" msgstr "Generuj hash dla plików (powolne!)" #: src/Gui/Preferences.cs:413 msgid "Fetch audio cd metadata from MusicBrainz.org" msgstr "Pobierz metadane płyty CD z MusicBrainz.org" #: src/Gui/Preferences.cs:416 msgid "Scanner" msgstr "Skaner" Basenji/po/sr.resources0000664000175000017500000004364512067326706015332 0ustar patrickpatricklSystem.Resources.ResourceReader, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089#System.Resources.RuntimeResourceSetPADPADP̯[\ĒZFn_`/+ܽێyB_2 bJ䗖x~?ޘi ǚ˚}朮G  +Iљ,ޠ}ѬX`pѨE7kxbݏѝ!峸/# *?8 ڻMo;,锼xb5x,QoċƵgsv59}΍\$о DaрO51 թ}&ٍɬڴn^/gk䷧ 4pz$dF>?y7 Taq;͈nYDoY`rYrY$sYsYStYj~Ԕx06ez Z P4 * J  o> 8a c iz $ |q c  O\mg:a}AKuQ>R j!ز$&P%%**U++,Q-SP.1;v9`9vE:Iu:>Y@;CBsDHI1L2Q;RfMSMeS@STXmޡY![[Page {0}/{1}</b> ({2} - {3} of {4} items)&<b>Scanner Log:</b>4<b>Volume Information:</b>XA cross-platform media indexing/search tool. AbortAdd Volume Added:VAll database changes have been rolled back.All files All items"*All supported formats7^An error occured while accessing drive {0}: {1}]fAn error occured while loading the volume list: {0}JAn unhandled exception occured ({0}).*App MenukApplicationsArchive No.Archive No.:ArchivesvAre you sure you really want to remove the selected volume? ArtistJAudio CDZAudio CD trackkAudiobooks Author Backup BytesCategoryCategory:Click on the icon to the left of the search field to build advanced search queries. Example: {0}FCompute hashcodes for files (slow!)Confirmation CopyrightCopyright (c) 8Created:ZCreatorq2Database '{0}' not found.&Database PropertiesDatabase accessFDatabase already exists. Overwrite? Database existsi $Database not found &Database not found. Database: Date added FDefault database not found. Create?7 Descending Description Description: Development Dimensions Directories Directories: Directory ,Discard symbolic links' DocumentsS 4Don't prompt, always scan:g Drive zDrive {0} is neither mounted nor does it contain an audio cd. .Drive {0} is not ready. DrivetypeN Durationi Duration:y Edit Item Error Extract metadata XFetch audio cd metadata from MusicBrainz.org File5 File countG Files:b Filesystemu Filetype Filter volumes Format Format: DFound {0} items in {1:F3} seconds. GB& Games*General4&Generate Thumbnails@ Genre_HashiHashed:qIcon theme: Images ImportImport DatabaseImport aborted.{0}</b>'.L0Please select a databaseDPlease select a database to import2Please select a database.:Please select a drive to scan*Preferences_ProducerqQuick tip: Recent DatabasesLReopen most recent database on startupRescan Volume( Restart requiredTReturn date: Scan in progressScanner"Scanning aborted.@Scanning completed successfully. |Scanning failed. Reason: an unhandled exception occured ({0}).C@Scanning of drive '{0}' started."Scanning started. SearchSearch Items/Search itemsHSearching...e"Show hidden filesv&Show in Main Window&Show iteminfo panelDShow thumbnails in the filebrowserSize^SoftwarepSort byVStopping Scanner and performing rollback...Symlink targetTB.Text2The selected icon theme is currently not supported on your system.>NThis database version is not supported.TimelTimeout: another search is probably still in progress.  Titlee Title:uxToo many search results. Please refine your search criteria.Total size:Track No.Tracks:Type&Unknown2Unknown format.FUnnamedd8Unsupported database version|"Unsupported theme(Using VolumeDB v{0}. Videos Volume%"Volume Properties1Volume type:P(VolumeDatabase fileshVolumeScanner*Waiting for drives...$Waiting for volumeYearYestYou must restart {0} for icontheme changes to take effect.dYou must stop scanning before closing this window.{hYou must stop the import before closing this window.(_Database Properties__Edit Volume_Import_Load Defaults_New Database_Open Database_Preferences _Quit0_Remove Volume=byWdefault] filesmfromno tracksyes"{0:0}% completed.{0} Bytes.{0} is already running.&{0} volumes loaded.Project-Id-Version: basenji Report-Msgid-Bugs-To: FULL NAME POT-Creation-Date: 2012-07-15 15:49+0200 PO-Revision-Date: 2012-10-30 08:48+0000 Last-Translator: Мирослав Николић Language-Team: Serbian translators MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Launchpad-Export-Date: 2012-11-18 12:32+0000 X-Generator: Launchpad (build 16278) Language: sr „{0}“ је {1}. Очекивани облик: {2} Исправите или уклоните податке које сте унели.(празно).{0} датотеке@Страна {0}/{1} (ставке {2} — {3} од {4}))Дневник скенирања:$Подаци о запису:hВишеплатформски алат за пописивање/претраживање медија.ОбуставиДодај запис Додато:KСве измене на бази података су поништене.Све датотекеСве ставке$Сви подржани облициeДошло је до грешке приликом приступања уређају „{0}“: {1}dДошло је до грешке приликом учитавања списка записа: {0}?Дошло је до неочекиване грешке ({0}).!Изборник програмаПрограмиАрхива бр.Архива бр.: АрхивеqДа ли сте сигурни да заиста желите да уклоните изабрани запис?ИзвођачАудио ЦД#Нумере звучног ЦД-аЗвучне књиге АуторРезерваБајтоваКатегоријаКатегорије:Кликните на иконицу са леве стране поља за претрагу да изградите упите напредне претраге. Пример: {0}NИзрачунај хеш резултат за датотеке (споро!)ПотврдаАуторска права Ауторска права (c) Направљено: Творац@База података „{0}“ није пронађена.*Својства базе података,Приступ базама податакаLБаза података већ постоји. Да је препишем?(База података постоји5База података није пронађена6База података није пронађена.База података:Датуму уносаaОсновна база података није пронађена. Да је направим?Опадајућем редуОпис Опис: РазвојДимензијеФасциклеФасцикле:Фасцикла*Одбаци симболичке везеДокументиDНе постављај упит већ одмах скенирај: Уређај`Уређај „{0}“ није ни постављен нити садржи звучни ЦД./Уређај „{0}“ није спреман.Врсти уређајаТрајањеТрајање:Измени ставку Грешка#Извуци метаподатке[Прибави метаподатке за аудио ЦД са Мозгића музикеДатотекаБрој датотекаДатотеке:Систем датотекаВрста датотекеФилтрирај записе Формат Облик:7Нађох {0} ставки за {1:F3} секунде.GBИгре ОпштеНаправи сличицеЖанрХешХеширано:Тема иконица: Слике Увези$Увези базу податакаУвоз је прекинут.,Увоз је успешно завршен.Увоз није успеоУвоз није успео!Увоз је у току Подаци!Неисправни подациСвојства ставкеВрста ставкеKBКључне речиКључне речи: Ознака Језик0Време последњег уписивањаУчитавам...$Датум изнајмљивања:Изнајмљена: МестоMB Порука РазноФилмови Музика Назив Назив:НеНема ставки.-Нема резултата претраге. НиштаБелешка9Отворите основну базу податакаДодатни назив;Опције: укључен Мозгић музике: {0}Опције: прављење сличица: {0}, извлачење метаподатака: {1}, одбацивање симболичких веза: {2}, хеширање: {3}. ОсталоБрој страница СликеAУнесите назив за нову базу података8Молим уметните запис „{0}“.,Изаберите базу података:Изаберите базу података за увоз8Молим изаберите базу података.3Одаберите диск за скенирањеПоставкеПроизвођачБрза помоћ:(Недавна база података_Приликом покретања отвори најсвежију базу података*Поново прегледај запис7Потребно је поновно покретањеДатум враћања:#Скенирање је у току Скенер+Скенирање је прекинуто.8Скенирање је успешно завршено.wСкенирање није успело. Разлог: дошло је до неочекиване грешке ({0}).:Скенирање диска „{0}“ је почело.%Скенирање је почело.ПотражиТражи ставкеТражите ставкеТражим...0Прикажи скривене датотеке/Прикажи у главном прозору7Прикажи поље са информацијамаJПрикажи сличице у претраживачу датотекаВеличинаПрограмиПоређај према]Заустављам скенирање и враћам на претходно стање...0Одредиште симболичке везеTB ТекстsИзабрана тема иконица тренутно није подржана на вашем систему.HОво издање базе података није подржано. ВремеZВреме истека: друга претрага вероватно још траје.Наслову Наслов:]Пронађох превише резултата. Сузите услов претраге.Укупна величина:Нумера бр. Нумере: ВрстаНепознатоНепознат облик.Неименовано@Издање базе података није подржаноНеподржана тема8Користим издање {0} БП волумена. Снимци ЗаписСвојства записаВрста диска:*Датотеке базе податакаСкенер дискова!Чекам на уређаје...Чекам на запис ГодинаДаuМорате поново да покренете {0} да би се тема за иконице применила.uМорате зауставити скенирање пре него што затворите овај прозор.kМорате зауставити увоз пре него што затворите овај прозор.+_Својства базе податакаУ_реди запис _Увези_Учитај основно#_Нова база података'_Отвори базу података_Поставке _ИзађиУ_клони записодосновнидатотекеодне нумередаЗавршено је: {0:0}%.Бајтова: {0}!{0} је већ покренут.#Учитаних записа: {0}.Basenji/po/cs.resources0000664000175000017500000003240612067326706015304 0ustar patrickpatricklSystem.Resources.ResourceReader, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089#System.Resources.RuntimeResourceSetPADPADP̯[\ĒZFn_`/+ܽێyB_2 bJ䗖x~?ޘ ǚ˚}朮G  +Iљ,ޠ}ѬX`pѨE7kݏѝ!峸/# *? ڻMo;,锼xb5x,Qoĵgsv59}΍\$о DaрO51 թ}&ٍɬڴn^/gk䷧p$dF>?y7 Taq;͈nYDoY`rYrY$sYsYStYj~Ԕx06ez Z P4 * J  o> 8a c iz $ |q c Omga}AKuQ>R j!ز$&P%%*U++1;v9`9vE:Iu:>Y@;CBsDH1L2Q;RfMSMeS@STXmޡY![[Page {0}/{1}</b> ({2} - {3} of {4} items)&<b>Scanner Log:</b>54<b>Volume Information:</b>RXA cross-platform media indexing/search tool.n Abort Added:VAll database changes have been rolled back.All filesAll items^An error occured while accessing drive {0}: {1}fAn error occured while loading the volume list: {0}TJAn unhandled exception occured ({0}).ApplicationsArchive No.Archive No.:ArchivesvAre you sure you really want to remove the selected volume? ArtistAudio CDAudio CD track%Audiobooks5 AuthorE BackupL BytesXCategory_Category:hFCompute hashcodes for files (slow!)tConfirmationCopyrightCopyright (c) Created:Creator2Database '{0}' not found.&Database PropertiesDatabase access%FDatabase already exists. Overwrite?<Database exists`$Database not foundt&Database not found.Database:Date addedFDefault database not found. Create?DescendingDescriptionDescription:DevelopmentDimensions Directories+Directories:7DirectoryD,Discard symbolic linksODocumentsl4Don't prompt, always scan:w Drive.Drive {0} is not ready.DrivetypeDurationDuration:Edit Item Error Extract metadataXFetch audio cd metadata from MusicBrainz.orgFile>File countF Files:WFilesystemaFiletypesFilter volumes FormatFormat:DFound {0} items in {1:F3} seconds.GB GamesGeneral&Generate Thumbnails GenreHashHashed: Icon theme: Images% Import/Import Database8Import aborted.N LReopen most recent database on startupS Restart required Return date: Scan in progress Scanner "Scanning aborted. @Scanning completed successfully. |Scanning failed. Reason: an unhandled exception occured ({0}). @Scanning of drive '{0}' started.T "Scanning started.y Search Items Search items Searching... "Show hidden files &Show iteminfo panel DShow thumbnails in the filebrowser Size9 SoftwareC Sort byM VStopping Scanner and performing rollback...[ Symlink target TB Text The selected icon theme is currently not supported on your system. NThis database version is not supported. TimelTimeout: another search is probably still in progress. Titleh Title:pxToo many search results. Please refine your search criteria.yTotal size:Track No.Tracks:TypeUnknownUnnamed 8Unsupported database version"Unsupported theme9(Using VolumeDB v{0}.O Videosm Volumet"Volume Properties|Volume type:(VolumeDatabase filesVolumeScanner*Waiting for drives...YearYestYou must restart {0} for icontheme changes to take effect.dYou must stop scanning before closing this window.2hYou must stop the import before closing this window.c(_Database Properties_Edit Volume_Import_Load Defaults_New Database_Open Database _Preferences _Quit,_Remove Volume7byJdefaultN filesYfrombnoe tracksiyesp"{0:0}% completed.u{0} Bytes.{0} is already running.&{0} volumes loaded.Project-Id-Version: basenji Report-Msgid-Bugs-To: FULL NAME POT-Creation-Date: 2012-07-15 15:49+0200 PO-Revision-Date: 2012-02-08 10:29+0000 Last-Translator: Konki Language-Team: Czech MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Launchpad-Export-Date: 2012-10-27 11:00+0000 X-Generator: Launchpad (build 16194) R"{0}" je {1}. Předpokládaný formát: {2} Opravte nebo odstraňte zadaná data. (prázdné)3Stránka {0}/{1} ({2} - {3} z {4} položek)Záznam skenování:Informace o svazku:?Multiplatformní mediální indexovací/vyhledávací nástroj.Zrušit Přidáno:0Všechny změny v databázi byly vráceny zpět.Všechny souboryVšechny položky7Vyskytla se chyba během přístupu k jednotce {0}: {1}:Během nahrávání seznamu svazků se vyskytla chyba: {0})Vyskytla se neošetřená vyjímka ({0}).Aplikace Archiv č. Archiv č.:Archivy)Opravdu chcete odstranit vybraný svazek?UmělecAudio CDStopa audio cdMluvené knihyAutor ZálohovatBajtySkupina Kategorie:,Vypočítat hashkódy pro soubory (pomalé!) PotvrzeníAutorská právaAutorská práva (c)  Vytvořeno:Tvůrce Databáze '{0}' nebyla nalezena.Vlastnosti databázePřístup k databázi"Databáze již existuje. Přepsat?Databáze existujeDatabáze nebyla nalezenaDatabáze nebyla nalezena. Databáze:Datum přidání/Výchozí databáze nebyla nalezena. Vytvořit? SestupněPopisekPopisek:Vývoj Rozměrů Adresáře Adresáře: AdresářVyřadit symbolické odkazy DokumentyNedotazovat se, vždy skenovat: MechanikaJednotka {0} není připravena. Typ jednotkyDélkaDélka:Upravit položkuChybaExtrahovat metadata+Získat metadata audio cd z MusicBrainz.orgSouborPočet souborůSoubory:Systém souborů Typ souboru Filtr svazkůFormátFormát:(Nalezeno {0} položek za {1:F3} vteřin.GBHryObecnéGenerování náhledůŽánr Rozdělit Rozděleno: Motiv ikony:ObrázkyPřidatImportovat databáziPřidání bylo zrušeno.'Přidání bylo úspěšně dokončeno.Přidání selhaloPřidání selhalo!Přidávání v průběhuNeplatná dataVlastnosti položky Typ položkykBKlíčová slovaKlíčová slova:PopisekJazykPoslední čas zápisuNačítání...Datum zapůjčení: Půjčeno do: UmístěníMBZprávaRůznéFilmyHudbaNázevNázev:NeŽádné položky."Žádné výsledky vyhledávání.Nic Poznámka Otevřít standardní databázi. JménoVolby Volby: MusicBrainz zapnutý: {0}OstatníPočet stránekObrázky"Vložte název pro novou databáziProsím vyberte databázi)Prosím vyberte databázi k importování(Prosím zvolte mechaniku pro skenování Předvolby ProducentPoslední databáze/Znovu otevřít poslední databázi při startuVyžadován restartDatum vrácení:Probíhá skenováníSkenerSkenování bylo zrušeno.(Skenování bylo úspěšně dokončeno.BSkenování selhalo. Důvod: nastala neošetřená vyjímka ({0}).#Skenování jednotky '{0}' začalo.Skenování začalo.Hledané položkyHledané položkyVyhledávání…Zobrazit skryté soubory'Zobrazit panel systémových informací,Zobrazovat náhledy v prohlížeči souborůVelikostSoftware Řadit podle0Zastavuje se skener a provádí se navracení... Cíl symlinkuTBTextFVybraný motiv ikony není aktuálně podporovaný ve vašem systému.(Tato verze databáze není podporována.ČasHVypršel časový limit: pravděpodobně probíhá jiné vyhledávání.NázevNázev:[Příliš mnoho výsledků vyhledávání. Prosím změňte vaše kritéria vyhledávání.Celková velikost: Stopa č.Stop:Typ Neznámý BezejmennýNepodporovaná verze databázeNepodporovaný motivPoužívá se VolumeDB v{0}.VideaSvazekVlastnosti svazku Typ svazku:Databáze souborů svazku SkenerSvazkuČeká se na mechaniky...RokAnoFJe nutný restart {0} , aby změna schémat ikon měla nějaký efekt./Před uzavřením musíte ukončit skenování.=Před uzavřením tohoto okna musíte ukončit importování._Vlastnosti databáze_Upravit svazek _Importovat_Načíst výchozí nastavení_Nová databáze_Otevřít databázi _Předvolby _Ukončit_Odstranit svazekod výchozísouboryznestopyano{0:0}% dokončeno. {0} Bajtů{0} již běží.{0} svazků načteno.Basenji/po/he.resources0000664000175000017500000002013112067326706015263 0ustar patrickpatricklSystem.Resources.ResourceReader, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089#System.Resources.RuntimeResourceSetePADPADP̯ĒZFn_`/+ܽێyB_ bJ䗖˚G +Iљ}pѨE7k!峸/ *? xb5x,Qoĵgsv̾ D51 Սɬgk愪F>?q;DoY`rYrY$sYsYStYj~Ԕx06Z * J  iz $ |q c OmAQ>R ز$&P%%`9Iu:>H1LfMSMeSTX![[] bObZgjl8npKt8u1vݷ wq|oт|e|)|0Ne &[# ,   {Q x H  f 5 H  C Xu#HX, 7 ,[ K 7 u "a 2 4?do t "{0}" is {1}. Expected format: {2} Please correct or remove the data you entered.(empty)&<b>Scanner Log:</b>4<b>Volume Information:</b>. Added:KVAll database changes have been rolled back.VAll files^An error occured while accessing drive {0}: {1}JAn unhandled exception occured ({0}).vAre you sure you really want to remove the selected volume?3 Backup BytesCategory:FCompute hashcodes for files (slow!)ConfirmationCopyright (c) Created:2Database '{0}' not found.&Database PropertiesEDatabase accesskFDatabase already exists. Overwrite?Database exists&Database not found.Description:Directories:,Discard symbolic links#DocumentsM4Don't prompt, always scan:[ Drive.Drive {0} is not ready. Error Files:FilesystemDFound {0} items in {1:F3} seconds.GBGeneral&Generate ThumbnailsHashed:@Icon theme:XInvalid datapKBKeywords: LabelLoading...Loaned date:Loaned to:MBMessageMisc Movies  Music Name:&No-None3 Other;PicturesCTPlease enter the name for the new databaseQ0Please select a database:Please select a drive to scanPreferencesLReopen most recent database on startup Restart required3Return date:S Scan in progressmScanner"Scanning aborted.@Scanning completed successfully.|Scanning failed. Reason: an unhandled exception occured ({0}).Search Items. Searching...G SizeT VStopping Scanner and performing rollback...\ TB NThis database version is not supported. Time lTimeout: another search is probably still in progress. Title:A Total size:N 8Unsupported database versionf (Using VolumeDB v{0}. "Volume Properties Volume type: (VolumeDatabase files VolumeScanner *Waiting for drives... Yes; tYou must restart {0} for icontheme changes to take effect.A dYou must stop scanning before closing this window. (_Database Properties _Load Defaults _New Database _Open Database< _PreferencesY _Quith _Remove Volumeu no yes {0} Bytes .{0} is already running. &{0} volumes loaded. Project-Id-Version: basenji Report-Msgid-Bugs-To: FULL NAME POT-Creation-Date: 2012-07-15 15:49+0200 PO-Revision-Date: 2008-10-28 07:41+0000 Last-Translator: Yaron Language-Team: Hebrew MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Launchpad-Export-Date: 2012-10-27 11:00+0000 X-Generator: Launchpad (build 16194) g"{0}" הינו {1}. המבנה הצפוי: {2} נא תקן או הסר את הנתונים שהזנת.(ריק)רישום הסורק:נתוני הכרך: נוסף:[כל השינויים במסד הנתונים שוחזרו לנתונים המקוריים.כל הקבצים9ארעה שגיאה בעת הגישה לכונן {0}: {1}0ארעה חריגה בלתי מטופלת ({0}).Jהאם אתה בטוח שברצונך להסיר את הכרך הנבחר? גיבויבתיםקטגוריה:3חשב צפני גיבוב לקבצים (איטי!) אישור%כל הזכויות שמורות (c)  נוצר:*מסד הנתונים '{0}' לא נמצא.$מאפייני מסד הנתונים גישה למסד הנתונים2מסד הנתונים כבר קיים. לשכתב?מסד הנתונים קיים$מסד הנתונים לא נמצא. תיאור: תיקיות:(התעלם מקישורים סמליים מסמכים#אל תודיע, סרוק תמיד:כונן!הכונן {0} אינו מוכן. שגיאה קבצים:מערכת קבצים(נמצאו {0} תוך {1:F3} שניות.ג"בכללי&ייצר תמונות ממוזערותהתבצע גיבוב:ערכת הסמלים:נתונים שגוייםק"במילות מפתח: תווית טוען...תאריך ההשאלה:הושאל ל־:מ"ב הודעה שונות סרטים מוסיקהשם:לאללאאחר תמונות4נא הזן את שם מסד הנתונים החדש!אנא בחר מסד נתונים#אנא בחר כונן לסריקה העדפותTפתח מחדש את מסד הנתונים העדכני ביותר עם ההפעלהנדרשת הפעלה מחדשתאריך ההחזרה:הסריקה בתהליכיםסורקהסריקה בוטלה.'הסריקה הושלמה בהצלחה.Sהסריקה נכשלה. סיבה: ארעה חריגה בלתי מטופלת ({0}).חיפוש פריטים מחפש...נפחRמבטל את פעולת הסורק ומבצע שיחזור של הנתונים...ט"ב8גירסת מסד נתונים זו אינה נתמכת.זמןFתום הזמן: כנראה ומתבצע חיפוש נוסף כרגע. כותרת:הגודל הכללי:0גירסת מסד הנתונים לא נתמכת'משתמש ב־VolumeDB גירסה {0}.מאפייני הכרךסוג הכרך:קבצי VolumeDatabaseסורק־הכרכיםממתין לכוננים...כןOעליך לאתחל את {0} כדי שערכת הסמלים תכנס לתוקףEעליך לעצור את הסריקה בטרם סגירת החלון.%_מאפייני מסד הנתוניםטען _ברירות מחדלמסד נתונים _חדש_פתח מסד נתונים הע_דפות י_ציאהה_סר כרךלאכן {0} בתים{0} כבר פעיל.נטענו {0} כרכים.Basenji/Basenji_win32.csproj0000664000175000017500000002371512067326706016147 0ustar patrickpatrick Debug AnyCPU 9.0.30729 2.0 {9D64337F-0383-47B8-8CAB-D7B7C3FE143C} WinExe Properties Basenji Basenji v4.0 512 images\basenji.ico OnOutputUpdated 3.5 http://localhost/Basenji/ true Web true Foreground 7 Days false false true 0 1.0.0.%2a true false true true full false bin\Debug\ DEBUG;TRACE prompt 4 x86 AllRules.ruleset pdbonly true bin\Release\ TRACE prompt 4 x86 AllRules.ruleset 3.5 {A8624816-6F0F-42EC-96AE-84C001272CD8} Platform_win32 {59B6E0D9-AF8C-40B1-A2F3-22C37503174C} VolumeDB_win32 False .NET Framework 3.5 SP1 Client Profile false False .NET Framework 3.5 SP1 true False Windows Installer 3.1 true IF NOT EXIST "$(TargetDir)data" GOTO NO_DATA_DIR rmdir "$(TargetDir)data" /s /q :NO_DATA_DIR mkdir "$(TargetDir)data" mkdir "$(TargetDir)data\themes" xcopy "$(ProjectDir)images\basenji.svg" "$(TargetDir)data" xcopy "$(ProjectDir)images\themes" "$(TargetDir)data\themes\" /e Basenji/Basenji.exe.config0000664000175000017500000000013612067326706015642 0ustar patrickpatrick Basenji/basenji.desktop.in0000664000175000017500000000035712067326706015740 0ustar patrickpatrick[Desktop Entry] Type=Application Name=Basenji Exec=basenji Terminal=false Icon=@expanded_datadir@/@PACKAGE@/basenji.svg Categories=Utility; Comment=A portable volume indexer. Comment[de]=Ein portierbares Datenträger-Indizierungswerkzeug. Basenji/src/0000775000175000017500000000000012067326706013107 5ustar patrickpatrickBasenji/src/Global.cs0000664000175000017500000000216012067326706014635 0ustar patrickpatrick// Global.cs // // Copyright (C) 2010, 2011 Patrick Ulbrich // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // using System; namespace Basenji { // global settings public static class Global { #if DEBUG private static bool enableDebugging = true; #else private static bool enableDebugging = false; #endif public static bool EnableDebugging { get { return enableDebugging; } set { enableDebugging = value; } } public static void EnforceCulture(string name) { S.SetCulture(name); } } } Basenji/src/Settings.cs0000664000175000017500000001731012067326706015240 0ustar patrickpatrick// Settings.cs // // Copyright (C) 2008 - 2012 Patrick Ulbrich // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // using System; using System.IO; using System.Collections.Generic; using Platform.Common.Diagnostics; using System.Reflection; namespace Basenji { public class Settings { private const string SETTINGS_FILE = "settings"; private const string NON_GNOME_CUSTOM_THEME = "Tango"; private const int DEFAULT_SORT_PROPERTY = (int)Gui.Widgets.VolumeSortProperty.Added; [SettingsAttribute("")] public string ScannerDevice { get; set; } // WARNING: the higher the value, the longer it // will take the cancellation (triggered by CancelAsync()) to complete. [SettingsAttribute("10")] public int ScannerBufferSize { get; set; } [SettingsAttribute("0")] public bool ScannerDiscardSymLinks { get; set; } [SettingsAttribute("0")] public bool ScannerComputeHashs { get; set; } [SettingsAttribute("1")] public bool ScannerGenerateThumbnails { get; set; } [SettingsAttribute("1")] public bool ScannerExtractMetaData { get; set; } [SettingsAttribute("1")] public bool ScannerEnableMusicBrainz { get; set; } [SettingsAttribute("1")] public bool OpenMostRecentDB { get; set; } [SettingsAttribute("")] public string MostRecentDBPath { get; set; } [SettingsAttribute("0")] public bool ShowThumbsInItemLists { get; set; } [SettingsAttribute("800")] public int MainWindowWidth { get; set; } [SettingsAttribute("480")] public int MainWindowHeight { get; set; } [SettingsAttribute("0")] public bool MainWindowIsMaximized { get; set; } [SettingsAttribute("1")] public bool ShowItemInfo { get; set; } [SettingsAttribute("0")] public bool ShowHiddenItems { get; set; } [SettingsAttribute("0")] public bool ItemInfoMinimized1 { get; set; } [SettingsAttribute("0")] public bool ItemInfoMinimized2 { get; set; } [SettingsAttribute("260")] public int MainWindowSplitterPosition { get; set; } [SettingsAttribute("")] public string CustomThemeName { get; set; } [SettingsAttribute("10")] public int SearchResultPageSize { get; set; } [SettingsAttribute("3")] public int VolumeSortProperty { get; set; } [SettingsAttribute("")] public string EnforceCulture { get; set; } public Settings() : this(false) {} private Settings(bool defaults) { Reset(); if (!defaults) Load(false); } // returns a Settings instance with defaults loaded public /*static*/ Settings GetDefaults() { return new Settings(true); } // returns the directory where the settingsfile is located public /*static*/ DirectoryInfo GetSettingsDirectory() { return new DirectoryInfo(GetSettingsPath()); } // determines if the settingsfile exists (has been written yet) public /*static*/ bool SettingsFileExists() { return File.Exists(Path.Combine(GetSettingsPath(), SETTINGS_FILE)); } // restore default settings public void Reset() { PropertyInfo[] propInfos = GetProperties(); foreach (PropertyInfo pi in propInfos) { Attribute[] atts = (Attribute[])pi.GetCustomAttributes(typeof(SettingsAttribute), false); // check if the property has the SettingsAttribute if (atts.Length == 0) continue; SettingsAttribute sa = (SettingsAttribute)atts[0]; SetPropertyValueFromString(pi, sa.DefaultValue); } // manually override with settings determined at runtime CustomThemeName = CurrentPlatform.IsGnome ? "" : NON_GNOME_CUSTOM_THEME; VolumeSortProperty = DEFAULT_SORT_PROPERTY; } public void Save() { // writes in UTF-8 encoding using (StreamWriter sw = new StreamWriter(Path.Combine(GetSettingsPath(), SETTINGS_FILE), false)) { PropertyInfo[] propInfos = GetProperties(); foreach (PropertyInfo pi in propInfos) { Attribute[] atts = (Attribute[])pi.GetCustomAttributes(typeof(SettingsAttribute), false); // check if the property has the SettingsAttribute if (atts.Length == 0) continue; string val; if (pi.PropertyType == typeof(bool)) val = (((bool)pi.GetValue(this, null)) ? "1" : "0"); else val = pi.GetValue(this, null).ToString(); sw.WriteLine("{0} = {1}", pi.Name, val); } } } public void Reload() { Load(true); } private void Load(bool throwException) { if (!SettingsFileExists()) { if (throwException) throw new FileNotFoundException("Settingsfile not found. Settings have probably not been saved yet."); return; } Dictionary settings = new Dictionary(); // read settings in a dictionary for faster access using (StreamReader sr = new StreamReader(Path.Combine(GetSettingsPath(), SETTINGS_FILE))) { string line; while((line = sr.ReadLine()) != null) { string[] pair = line.Split('='); if (pair.Length != 2) continue; string key = pair[0].Trim(); string value = pair[1].Trim(); if (!settings.ContainsKey(key)) settings.Add(key, value); } } // assign settings to the properties PropertyInfo[] propInfos = GetProperties(); foreach (PropertyInfo pi in propInfos) { Attribute[] atts = (Attribute[])pi.GetCustomAttributes(typeof(SettingsAttribute), false); // check if the property has the SettingsAttribute if (atts.Length == 0) continue; string val; if (settings.TryGetValue(pi.Name, out val)) SetPropertyValueFromString(pi, val); } } private void SetPropertyValueFromString(PropertyInfo pi, string val) { if (pi.PropertyType == typeof(string)) { pi.SetValue(this, val, null); } else if (pi.PropertyType == typeof(int)) { pi.SetValue(this, int.Parse(val), null); } else if (pi.PropertyType == typeof(long)) { pi.SetValue(this, long.Parse(val), null); } else if (pi.PropertyType == typeof(bool)) { pi.SetValue(this, (val == "1" ? true : false), null); } } private static string GetSettingsPath() { // support a local settings dir for users that want to // carry Basenji around on a USB key. string localSettingsPath = Path.Combine(Environment.CurrentDirectory, "app_data"); if (Directory.Exists(localSettingsPath)) { return localSettingsPath; } else { string appDataPath = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData); string settingsPath = Path.Combine(appDataPath, App.Name); if (!Directory.Exists(settingsPath)) Directory.CreateDirectory(settingsPath); return settingsPath; } } private static PropertyInfo[] propertyInfos = null; private static PropertyInfo[] GetProperties() { if (propertyInfos != null) return propertyInfos; Type t = typeof(Settings); propertyInfos = t.GetProperties(BindingFlags.Instance | BindingFlags.Public); return propertyInfos; } [AttributeUsage(AttributeTargets.Property)] class SettingsAttribute : Attribute { public SettingsAttribute(string defaultValue) : base() { this.DefaultValue = defaultValue; } public string DefaultValue { get; set; } } } } Basenji/src/Util.cs0000664000175000017500000000733012067326706014356 0ustar patrickpatrick// Util.cs // // Copyright (C) 2008, 2009 Patrick Ulbrich // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // using System; using System.Runtime.InteropServices; using System.Reflection; using Platform.Common.Diagnostics; namespace Basenji { public static class Util { public static string GetSizeStr(long size) { if (size < 1024) return string.Format(S._("{0} Bytes"), size); string[] units = { S._("Bytes"), S._("KB"), S._("MB"), S._("GB"), S._("TB") }; double dblSize = size; int n = 0; while (dblSize > 1023.995 /* dblSize >= 1024.0 */) { dblSize /= 1024.0; n++; } // rounds up starting at .995 return string.Format("{0:N2} {1}", dblSize, units[n]); } public static string Escape(string str) { // Note : String.Replace() is better suited than // Stringbuilder.Replace() in this case, // as String.Replace() returns the same string instance // if oldValue can't be found (which applies in the majority of cases). str = str.Replace("&", "&"); str = str.Replace("<", "<"); str = str.Replace(">", ">"); str = str.Replace("\"", """); str = str.Replace("'", "'"); return str; } // Copied from Banshee.Hyena.Gui.GtkUtilities // Copyright (C) 2007 Aaron Bockover public static Gdk.Color ColorBlend(Gdk.Color a, Gdk.Color b) { // at some point, might be nice to allow any blend? double blend = 0.5; if (blend < 0.0 || blend > 1.0) { throw new ApplicationException ("blend < 0.0 || blend > 1.0"); } double blendRatio = 1.0 - blend; int aR = a.Red >> 8; int aG = a.Green >> 8; int aB = a.Blue >> 8; int bR = b.Red >> 8; int bG = b.Green >> 8; int bB = b.Blue >> 8; double mR = aR + bR; double mG = aG + bG; double mB = aB + bB; double blR = mR * blendRatio; double blG = mG * blendRatio; double blB = mB * blendRatio; Gdk.Color color = new Gdk.Color ((byte)blR, (byte)blG, (byte)blB); Gdk.Colormap.System.AllocColor (ref color, true, true); return color; } public static string FormatExceptionMsg(Exception e) { string msg = e.Message; int breakPos = msg.IndexOfAny(Environment.NewLine.ToCharArray()); if (breakPos > -1) msg = msg.Substring(0, breakPos); return msg + "."; } public static string GetVolumeDBVersion() { Assembly asm = Assembly.GetAssembly(typeof(VolumeDB.VolumeDatabase)); return asm.GetName().Version.ToString(); } public static void SetProcName(string name) { const int PR_SET_NAME = 0x0F; IntPtr arg = Marshal.StringToHGlobalAnsi(name); try { if (prctl(PR_SET_NAME, (ulong)arg.ToInt64(), 0, 0, 0) != 0) Debug.WriteLine("prctl() failed"); } catch (EntryPointNotFoundException) { IntPtr fmt = Marshal.StringToHGlobalAnsi("%s"); setproctitle(fmt, arg); Marshal.FreeHGlobal(fmt); } Marshal.FreeHGlobal(arg); } // linux [DllImport("libc")] private static extern int prctl (int option, ulong arg2, ulong arg3, ulong arg4, ulong arg5); // bsd [DllImport("libc")] private static extern void setproctitle(IntPtr format, IntPtr arg); } } Basenji/src/Options.cs0000664000175000017500000007641412067326706015105 0ustar patrickpatrick// // Options.cs // // Authors: // Jonathan Pryor // // Copyright (C) 2008 Novell (http://www.novell.com) // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: // // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // // Compile With: // gmcs -debug+ -r:System.Core Options.cs -o:NDesk.Options.dll // gmcs -debug+ -d:LINQ -r:System.Core Options.cs -o:NDesk.Options.dll // // The LINQ version just changes the implementation of // OptionSet.Parse(IEnumerable), and confers no semantic changes. // // A Getopt::Long-inspired option parsing library for C#. // // NDesk.Options.OptionSet is built upon a key/value table, where the // key is a option format string and the value is a delegate that is // invoked when the format string is matched. // // Option format strings: // Regex-like BNF Grammar: // name: .+ // type: [=:] // sep: ( [^{}]+ | '{' .+ '}' )? // aliases: ( name type sep ) ( '|' name type sep )* // // Each '|'-delimited name is an alias for the associated action. If the // format string ends in a '=', it has a required value. If the format // string ends in a ':', it has an optional value. If neither '=' or ':' // is present, no value is supported. `=' or `:' need only be defined on one // alias, but if they are provided on more than one they must be consistent. // // Each alias portion may also end with a "key/value separator", which is used // to split option values if the option accepts > 1 value. If not specified, // it defaults to '=' and ':'. If specified, it can be any character except // '{' and '}' OR the *string* between '{' and '}'. If no separator should be // used (i.e. the separate values should be distinct arguments), then "{}" // should be used as the separator. // // Options are extracted either from the current option by looking for // the option name followed by an '=' or ':', or is taken from the // following option IFF: // - The current option does not contain a '=' or a ':' // - The current option requires a value (i.e. not a Option type of ':') // // The `name' used in the option format string does NOT include any leading // option indicator, such as '-', '--', or '/'. All three of these are // permitted/required on any named option. // // Option bundling is permitted so long as: // - '-' is used to start the option group // - all of the bundled options are a single character // - at most one of the bundled options accepts a value, and the value // provided starts from the next character to the end of the string. // // This allows specifying '-a -b -c' as '-abc', and specifying '-D name=value' // as '-Dname=value'. // // Option processing is disabled by specifying "--". All options after "--" // are returned by OptionSet.Parse() unchanged and unprocessed. // // Unprocessed options are returned from OptionSet.Parse(). // // Examples: // int verbose = 0; // OptionSet p = new OptionSet () // .Add ("v", v => ++verbose) // .Add ("name=|value=", v => Console.WriteLine (v)); // p.Parse (new string[]{"-v", "--v", "/v", "-name=A", "/name", "B", "extra"}); // // The above would parse the argument string array, and would invoke the // lambda expression three times, setting `verbose' to 3 when complete. // It would also print out "A" and "B" to standard output. // The returned array would contain the string "extra". // // C# 3.0 collection initializers are supported and encouraged: // var p = new OptionSet () { // { "h|?|help", v => ShowHelp () }, // }; // // System.ComponentModel.TypeConverter is also supported, allowing the use of // custom data types in the callback type; TypeConverter.ConvertFromString() // is used to convert the value option to an instance of the specified // type: // // var p = new OptionSet () { // { "foo=", (Foo f) => Console.WriteLine (f.ToString ()) }, // }; // // Random other tidbits: // - Boolean options (those w/o '=' or ':' in the option format string) // are explicitly enabled if they are followed with '+', and explicitly // disabled if they are followed with '-': // string a = null; // var p = new OptionSet () { // { "a", s => a = s }, // }; // p.Parse (new string[]{"-a"}); // sets v != null // p.Parse (new string[]{"-a+"}); // sets v != null // p.Parse (new string[]{"-a-"}); // sets v == null // using System; using System.Collections; using System.Collections.Generic; using System.Collections.ObjectModel; using System.ComponentModel; using System.Globalization; using System.IO; using System.Runtime.Serialization; using System.Security.Permissions; using System.Text; using System.Text.RegularExpressions; #if LINQ using System.Linq; #endif #if TEST using NDesk.Options; #endif namespace NDesk.Options { public class OptionValueCollection : IList, IList { List values = new List (); OptionContext c; internal OptionValueCollection (OptionContext c) { this.c = c; } #region ICollection void ICollection.CopyTo (Array array, int index) {(values as ICollection).CopyTo (array, index);} bool ICollection.IsSynchronized {get {return (values as ICollection).IsSynchronized;}} object ICollection.SyncRoot {get {return (values as ICollection).SyncRoot;}} #endregion #region ICollection public void Add (string item) {values.Add (item);} public void Clear () {values.Clear ();} public bool Contains (string item) {return values.Contains (item);} public void CopyTo (string[] array, int arrayIndex) {values.CopyTo (array, arrayIndex);} public bool Remove (string item) {return values.Remove (item);} public int Count {get {return values.Count;}} public bool IsReadOnly {get {return false;}} #endregion #region IEnumerable IEnumerator IEnumerable.GetEnumerator () {return values.GetEnumerator ();} #endregion #region IEnumerable public IEnumerator GetEnumerator () {return values.GetEnumerator ();} #endregion #region IList int IList.Add (object value) {return (values as IList).Add (value);} bool IList.Contains (object value) {return (values as IList).Contains (value);} int IList.IndexOf (object value) {return (values as IList).IndexOf (value);} void IList.Insert (int index, object value) {(values as IList).Insert (index, value);} void IList.Remove (object value) {(values as IList).Remove (value);} void IList.RemoveAt (int index) {(values as IList).RemoveAt (index);} bool IList.IsFixedSize {get {return false;}} object IList.this [int index] {get {return this [index];} set {(values as IList)[index] = value;}} #endregion #region IList public int IndexOf (string item) {return values.IndexOf (item);} public void Insert (int index, string item) {values.Insert (index, item);} public void RemoveAt (int index) {values.RemoveAt (index);} private void AssertValid (int index) { if (c.Option == null) throw new InvalidOperationException ("OptionContext.Option is null."); if (index >= c.Option.MaxValueCount) throw new ArgumentOutOfRangeException ("index"); if (c.Option.OptionValueType == OptionValueType.Required && index >= values.Count) throw new OptionException (string.Format ( c.OptionSet.MessageLocalizer ("Missing required value for option '{0}'."), c.OptionName), c.OptionName); } public string this [int index] { get { AssertValid (index); return index >= values.Count ? null : values [index]; } set { values [index] = value; } } #endregion public List ToList () { return new List (values); } public string[] ToArray () { return values.ToArray (); } public override string ToString () { return string.Join (", ", values.ToArray ()); } } public class OptionContext { private Option option; private string name; private int index; private OptionSet set; private OptionValueCollection c; public OptionContext (OptionSet set) { this.set = set; this.c = new OptionValueCollection (this); } public Option Option { get {return option;} set {option = value;} } public string OptionName { get {return name;} set {name = value;} } public int OptionIndex { get {return index;} set {index = value;} } public OptionSet OptionSet { get {return set;} } public OptionValueCollection OptionValues { get {return c;} } } public enum OptionValueType { None, Optional, Required, } public abstract class Option { string prototype, description; string[] names; OptionValueType type; int count; string[] separators; protected Option (string prototype, string description) : this (prototype, description, 1) { } protected Option (string prototype, string description, int maxValueCount) { if (prototype == null) throw new ArgumentNullException ("prototype"); if (prototype.Length == 0) throw new ArgumentException ("Cannot be the empty string.", "prototype"); if (maxValueCount < 0) throw new ArgumentOutOfRangeException ("maxValueCount"); this.prototype = prototype; this.names = prototype.Split ('|'); this.description = description; this.count = maxValueCount; this.type = ParsePrototype (); if (this.count == 0 && type != OptionValueType.None) throw new ArgumentException ( "Cannot provide maxValueCount of 0 for OptionValueType.Required or " + "OptionValueType.Optional.", "maxValueCount"); if (this.type == OptionValueType.None && maxValueCount > 1) throw new ArgumentException ( string.Format ("Cannot provide maxValueCount of {0} for OptionValueType.None.", maxValueCount), "maxValueCount"); if (Array.IndexOf (names, "<>") >= 0 && ((names.Length == 1 && this.type != OptionValueType.None) || (names.Length > 1 && this.MaxValueCount > 1))) throw new ArgumentException ( "The default option handler '<>' cannot require values.", "prototype"); } public string Prototype {get {return prototype;}} public string Description {get {return description;}} public OptionValueType OptionValueType {get {return type;}} public int MaxValueCount {get {return count;}} public string[] GetNames () { return (string[]) names.Clone (); } public string[] GetValueSeparators () { if (separators == null) return new string [0]; return (string[]) separators.Clone (); } protected static T Parse (string value, OptionContext c) { TypeConverter conv = TypeDescriptor.GetConverter (typeof (T)); T t = default (T); try { if (value != null) t = (T) conv.ConvertFromString (value); } catch (Exception e) { throw new OptionException ( string.Format ( c.OptionSet.MessageLocalizer ("Could not convert string `{0}' to type {1} for option `{2}'."), value, typeof (T).Name, c.OptionName), c.OptionName, e); } return t; } internal string[] Names {get {return names;}} internal string[] ValueSeparators {get {return separators;}} static readonly char[] NameTerminator = new char[]{'=', ':'}; private OptionValueType ParsePrototype () { char type = '\0'; List seps = new List (); for (int i = 0; i < names.Length; ++i) { string name = names [i]; if (name.Length == 0) throw new ArgumentException ("Empty option names are not supported.", "prototype"); int end = name.IndexOfAny (NameTerminator); if (end == -1) continue; names [i] = name.Substring (0, end); if (type == '\0' || type == name [end]) type = name [end]; else throw new ArgumentException ( string.Format ("Conflicting option types: '{0}' vs. '{1}'.", type, name [end]), "prototype"); AddSeparators (name, end, seps); } if (type == '\0') return OptionValueType.None; if (count <= 1 && seps.Count != 0) throw new ArgumentException ( string.Format ("Cannot provide key/value separators for Options taking {0} value(s).", count), "prototype"); if (count > 1) { if (seps.Count == 0) this.separators = new string[]{":", "="}; else if (seps.Count == 1 && seps [0].Length == 0) this.separators = null; else this.separators = seps.ToArray (); } return type == '=' ? OptionValueType.Required : OptionValueType.Optional; } private static void AddSeparators (string name, int end, ICollection seps) { int start = -1; for (int i = end+1; i < name.Length; ++i) { switch (name [i]) { case '{': if (start != -1) throw new ArgumentException ( string.Format ("Ill-formed name/value separator found in \"{0}\".", name), "prototype"); start = i+1; break; case '}': if (start == -1) throw new ArgumentException ( string.Format ("Ill-formed name/value separator found in \"{0}\".", name), "prototype"); seps.Add (name.Substring (start, i-start)); start = -1; break; default: if (start == -1) seps.Add (name [i].ToString ()); break; } } if (start != -1) throw new ArgumentException ( string.Format ("Ill-formed name/value separator found in \"{0}\".", name), "prototype"); } public void Invoke (OptionContext c) { OnParseComplete (c); c.OptionName = null; c.Option = null; c.OptionValues.Clear (); } protected abstract void OnParseComplete (OptionContext c); public override string ToString () { return Prototype; } } [Serializable] public class OptionException : Exception { private string option; public OptionException () { } public OptionException (string message, string optionName) : base (message) { this.option = optionName; } public OptionException (string message, string optionName, Exception innerException) : base (message, innerException) { this.option = optionName; } protected OptionException (SerializationInfo info, StreamingContext context) : base (info, context) { this.option = info.GetString ("OptionName"); } public string OptionName { get {return this.option;} } [SecurityPermission (SecurityAction.LinkDemand, SerializationFormatter = true)] public override void GetObjectData (SerializationInfo info, StreamingContext context) { base.GetObjectData (info, context); info.AddValue ("OptionName", option); } } public delegate void OptionAction (TKey key, TValue value); public class OptionSet : KeyedCollection { public OptionSet () : this (delegate (string f) {return f;}) { } public OptionSet (Converter localizer) { this.localizer = localizer; } Converter localizer; public Converter MessageLocalizer { get {return localizer;} } protected override string GetKeyForItem (Option item) { if (item == null) throw new ArgumentNullException ("option"); if (item.Names != null && item.Names.Length > 0) return item.Names [0]; // This should never happen, as it's invalid for Option to be // constructed w/o any names. throw new InvalidOperationException ("Option has no names!"); } [Obsolete ("Use KeyedCollection.this[string]")] protected Option GetOptionForName (string option) { if (option == null) throw new ArgumentNullException ("option"); try { return base [option]; } catch (KeyNotFoundException) { return null; } } protected override void InsertItem (int index, Option item) { base.InsertItem (index, item); AddImpl (item); } protected override void RemoveItem (int index) { base.RemoveItem (index); Option p = Items [index]; // KeyedCollection.RemoveItem() handles the 0th item for (int i = 1; i < p.Names.Length; ++i) { Dictionary.Remove (p.Names [i]); } } protected override void SetItem (int index, Option item) { base.SetItem (index, item); RemoveItem (index); AddImpl (item); } private void AddImpl (Option option) { if (option == null) throw new ArgumentNullException ("option"); List added = new List (option.Names.Length); try { // KeyedCollection.InsertItem/SetItem handle the 0th name. for (int i = 1; i < option.Names.Length; ++i) { Dictionary.Add (option.Names [i], option); added.Add (option.Names [i]); } } catch (Exception) { foreach (string name in added) Dictionary.Remove (name); throw; } } public new OptionSet Add (Option option) { base.Add (option); return this; } sealed class ActionOption : Option { Action action; public ActionOption (string prototype, string description, int count, Action action) : base (prototype, description, count) { if (action == null) throw new ArgumentNullException ("action"); this.action = action; } protected override void OnParseComplete (OptionContext c) { action (c.OptionValues); } } public OptionSet Add (string prototype, Action action) { return Add (prototype, null, action); } public OptionSet Add (string prototype, string description, Action action) { if (action == null) throw new ArgumentNullException ("action"); Option p = new ActionOption (prototype, description, 1, delegate (OptionValueCollection v) { action (v [0]); }); base.Add (p); return this; } public OptionSet Add (string prototype, OptionAction action) { return Add (prototype, null, action); } public OptionSet Add (string prototype, string description, OptionAction action) { if (action == null) throw new ArgumentNullException ("action"); Option p = new ActionOption (prototype, description, 2, delegate (OptionValueCollection v) {action (v [0], v [1]);}); base.Add (p); return this; } sealed class ActionOption : Option { Action action; public ActionOption (string prototype, string description, Action action) : base (prototype, description, 1) { if (action == null) throw new ArgumentNullException ("action"); this.action = action; } protected override void OnParseComplete (OptionContext c) { action (Parse (c.OptionValues [0], c)); } } sealed class ActionOption : Option { OptionAction action; public ActionOption (string prototype, string description, OptionAction action) : base (prototype, description, 2) { if (action == null) throw new ArgumentNullException ("action"); this.action = action; } protected override void OnParseComplete (OptionContext c) { action ( Parse (c.OptionValues [0], c), Parse (c.OptionValues [1], c)); } } public OptionSet Add (string prototype, Action action) { return Add (prototype, null, action); } public OptionSet Add (string prototype, string description, Action action) { return Add (new ActionOption (prototype, description, action)); } public OptionSet Add (string prototype, OptionAction action) { return Add (prototype, null, action); } public OptionSet Add (string prototype, string description, OptionAction action) { return Add (new ActionOption (prototype, description, action)); } protected virtual OptionContext CreateOptionContext () { return new OptionContext (this); } #if LINQ public List Parse (IEnumerable arguments) { bool process = true; OptionContext c = CreateOptionContext (); c.OptionIndex = -1; var def = GetOptionForName ("<>"); var unprocessed = from argument in arguments where ++c.OptionIndex >= 0 && (process || def != null) ? process ? argument == "--" ? (process = false) : !Parse (argument, c) ? def != null ? Unprocessed (null, def, c, argument) : true : false : def != null ? Unprocessed (null, def, c, argument) : true : true select argument; List r = unprocessed.ToList (); if (c.Option != null) c.Option.Invoke (c); return r; } #else public List Parse (IEnumerable arguments) { OptionContext c = CreateOptionContext (); c.OptionIndex = -1; bool process = true; List unprocessed = new List (); Option def = Contains ("<>") ? this ["<>"] : null; foreach (string argument in arguments) { ++c.OptionIndex; if (argument == "--") { process = false; continue; } if (!process) { Unprocessed (unprocessed, def, c, argument); continue; } if (!Parse (argument, c)) Unprocessed (unprocessed, def, c, argument); } if (c.Option != null) c.Option.Invoke (c); return unprocessed; } #endif private static bool Unprocessed (ICollection extra, Option def, OptionContext c, string argument) { if (def == null) { extra.Add (argument); return false; } c.OptionValues.Add (argument); c.Option = def; c.Option.Invoke (c); return false; } private readonly Regex ValueOption = new Regex ( @"^(?--|-|/)(?[^:=]+)((?[:=])(?.*))?$"); protected bool GetOptionParts (string argument, out string flag, out string name, out string sep, out string value) { if (argument == null) throw new ArgumentNullException ("argument"); flag = name = sep = value = null; Match m = ValueOption.Match (argument); if (!m.Success) { return false; } flag = m.Groups ["flag"].Value; name = m.Groups ["name"].Value; if (m.Groups ["sep"].Success && m.Groups ["value"].Success) { sep = m.Groups ["sep"].Value; value = m.Groups ["value"].Value; } return true; } protected virtual bool Parse (string argument, OptionContext c) { if (c.Option != null) { ParseValue (argument, c); return true; } string f, n, s, v; if (!GetOptionParts (argument, out f, out n, out s, out v)) return false; Option p; if (Contains (n)) { p = this [n]; c.OptionName = f + n; c.Option = p; switch (p.OptionValueType) { case OptionValueType.None: c.OptionValues.Add (n); c.Option.Invoke (c); break; case OptionValueType.Optional: case OptionValueType.Required: ParseValue (v, c); break; } return true; } // no match; is it a bool option? if (ParseBool (argument, n, c)) return true; // is it a bundled option? if (ParseBundledValue (f, string.Concat (n + s + v), c)) return true; return false; } private void ParseValue (string option, OptionContext c) { if (option != null) foreach (string o in c.Option.ValueSeparators != null ? option.Split (c.Option.ValueSeparators, StringSplitOptions.None) : new string[]{option}) { c.OptionValues.Add (o); } if (c.OptionValues.Count == c.Option.MaxValueCount || c.Option.OptionValueType == OptionValueType.Optional) c.Option.Invoke (c); else if (c.OptionValues.Count > c.Option.MaxValueCount) { throw new OptionException (localizer (string.Format ( "Error: Found {0} option values when expecting {1}.", c.OptionValues.Count, c.Option.MaxValueCount)), c.OptionName); } } private bool ParseBool (string option, string n, OptionContext c) { Option p; string rn; if (n.Length >= 1 && (n [n.Length-1] == '+' || n [n.Length-1] == '-') && Contains ((rn = n.Substring (0, n.Length-1)))) { p = this [rn]; string v = n [n.Length-1] == '+' ? option : null; c.OptionName = option; c.Option = p; c.OptionValues.Add (v); p.Invoke (c); return true; } return false; } private bool ParseBundledValue (string f, string n, OptionContext c) { if (f != "-") return false; for (int i = 0; i < n.Length; ++i) { Option p; string opt = f + n [i].ToString (); string rn = n [i].ToString (); if (!Contains (rn)) { if (i == 0) return false; throw new OptionException (string.Format (localizer ( "Cannot bundle unregistered option '{0}'."), opt), opt); } p = this [rn]; switch (p.OptionValueType) { case OptionValueType.None: Invoke (c, opt, n, p); break; case OptionValueType.Optional: case OptionValueType.Required: { string v = n.Substring (i+1); c.Option = p; c.OptionName = opt; ParseValue (v.Length != 0 ? v : null, c); return true; } default: throw new InvalidOperationException ("Unknown OptionValueType: " + p.OptionValueType); } } return true; } private static void Invoke (OptionContext c, string name, string value, Option option) { c.OptionName = name; c.Option = option; c.OptionValues.Add (value); option.Invoke (c); } private const int OptionWidth = 29; public void WriteOptionDescriptions (TextWriter o) { foreach (Option p in this) { int written = 0; if (!WriteOptionPrototype (o, p, ref written)) continue; if (written < OptionWidth) o.Write (new string (' ', OptionWidth - written)); else { o.WriteLine (); o.Write (new string (' ', OptionWidth)); } List lines = GetLines (localizer (GetDescription (p.Description))); o.WriteLine (lines [0]); string prefix = new string (' ', OptionWidth+2); for (int i = 1; i < lines.Count; ++i) { o.Write (prefix); o.WriteLine (lines [i]); } } } bool WriteOptionPrototype (TextWriter o, Option p, ref int written) { string[] names = p.Names; int i = GetNextOptionIndex (names, 0); if (i == names.Length) return false; if (names [i].Length == 1) { Write (o, ref written, " -"); Write (o, ref written, names [0]); } else { Write (o, ref written, " --"); Write (o, ref written, names [0]); } for ( i = GetNextOptionIndex (names, i+1); i < names.Length; i = GetNextOptionIndex (names, i+1)) { Write (o, ref written, ", "); Write (o, ref written, names [i].Length == 1 ? "-" : "--"); Write (o, ref written, names [i]); } if (p.OptionValueType == OptionValueType.Optional || p.OptionValueType == OptionValueType.Required) { if (p.OptionValueType == OptionValueType.Optional) { Write (o, ref written, localizer ("[")); } Write (o, ref written, localizer ("=" + GetArgumentName (0, p.MaxValueCount, p.Description))); string sep = p.ValueSeparators != null && p.ValueSeparators.Length > 0 ? p.ValueSeparators [0] : " "; for (int c = 1; c < p.MaxValueCount; ++c) { Write (o, ref written, localizer (sep + GetArgumentName (c, p.MaxValueCount, p.Description))); } if (p.OptionValueType == OptionValueType.Optional) { Write (o, ref written, localizer ("]")); } } return true; } static int GetNextOptionIndex (string[] names, int i) { while (i < names.Length && names [i] == "<>") { ++i; } return i; } static void Write (TextWriter o, ref int n, string s) { n += s.Length; o.Write (s); } private static string GetArgumentName (int index, int maxIndex, string description) { if (description == null) return maxIndex == 1 ? "VALUE" : "VALUE" + (index + 1); string[] nameStart; if (maxIndex == 1) nameStart = new string[]{"{0:", "{"}; else nameStart = new string[]{"{" + index + ":"}; for (int i = 0; i < nameStart.Length; ++i) { int start, j = 0; do { start = description.IndexOf (nameStart [i], j); } while (start >= 0 && j != 0 ? description [j++ - 1] == '{' : false); if (start == -1) continue; int end = description.IndexOf ("}", start); if (end == -1) continue; return description.Substring (start + nameStart [i].Length, end - start - nameStart [i].Length); } return maxIndex == 1 ? "VALUE" : "VALUE" + (index + 1); } private static string GetDescription (string description) { if (description == null) return string.Empty; StringBuilder sb = new StringBuilder (description.Length); int start = -1; for (int i = 0; i < description.Length; ++i) { switch (description [i]) { case '{': if (i == start) { sb.Append ('{'); start = -1; } else if (start < 0) start = i + 1; break; case '}': if (start < 0) { if ((i+1) == description.Length || description [i+1] != '}') throw new InvalidOperationException ("Invalid option description: " + description); ++i; sb.Append ("}"); } else { sb.Append (description.Substring (start, i - start)); start = -1; } break; case ':': if (start < 0) goto default; start = i + 1; break; default: if (start < 0) sb.Append (description [i]); break; } } return sb.ToString (); } private static List GetLines (string description) { List lines = new List (); if (string.IsNullOrEmpty (description)) { lines.Add (string.Empty); return lines; } int length = 80 - OptionWidth - 2; int start = 0, end; do { end = GetLineEnd (start, length, description); bool cont = false; if (end < description.Length) { char c = description [end]; if (c == '-' || (char.IsWhiteSpace (c) && c != '\n')) ++end; else if (c != '\n') { cont = true; --end; } } lines.Add (description.Substring (start, end - start)); if (cont) { lines [lines.Count-1] += "-"; } start = end; if (start < description.Length && description [start] == '\n') ++start; } while (end < description.Length); return lines; } private static int GetLineEnd (int start, int length, string description) { int end = Math.Min (start + length, description.Length); int sep = -1; for (int i = start; i < end; ++i) { switch (description [i]) { case ' ': case '\t': case '\v': case '-': case ',': case '.': case ';': sep = i; break; case '\n': return i; } } if (sep == -1 || end == description.Length) return end; return sep; } } } Basenji/src/MimeCategoryMapping.cs0000664000175000017500000001216012067326706017337 0ustar patrickpatrick// MimeCategoryMapping.cs // // Copyright (C) 2010 Patrick Ulbrich // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // using System; using System.Collections.Generic; namespace Basenji { // class that maps data items to mime cateogories (e.g. pictures) public static class MimeCategoryMapping { public static Dictionary GetMapping(T directoryCategoryData, T textCategoryData, T documentCategoryData, T musicCategoryData, T movieCategoryData, T imageCategoryData, T applicationCategoryData, T archiveCategoryData, T developmentCategoryData) { // mimetype -> category data mapping Dictionary mapping = new Dictionary() { /* directories */ { "x-directory/normal", directoryCategoryData }, /* text */ { "text/plain", textCategoryData }, /* documents */ { "application/vnd.oasis.opendocument.text", documentCategoryData }, { "application/vnd.oasis.opendocument.spreadsheet", documentCategoryData }, { "application/vnd.oasis.opendocument.presentation", documentCategoryData }, { "application/rtf", documentCategoryData }, { "application/msword", documentCategoryData }, { "application/vnd.ms-excel", documentCategoryData }, { "application/pdf", documentCategoryData }, { "application/xml", documentCategoryData }, { "text/html", documentCategoryData }, /* music */ { "audio/mpeg", musicCategoryData }, { "audio/mp4", musicCategoryData }, { "audio/x-flac", musicCategoryData }, { "application/ogg", musicCategoryData }, { "audio/ogg", musicCategoryData }, { "audio/x-wav", musicCategoryData }, { "audio/x-speex", musicCategoryData }, /* movies */ { "video/x-msvideo", movieCategoryData }, { "video/quicktime", movieCategoryData }, { "video/avi", movieCategoryData }, { "video/mp4", movieCategoryData }, { "video/ogg", movieCategoryData }, { "video/x-flv", movieCategoryData }, /* images */ { "image/jpeg", imageCategoryData }, { "image/png", imageCategoryData }, { "image/bmp", imageCategoryData }, { "image/x-xpixmap", imageCategoryData }, { "image/gif", imageCategoryData }, { "image/tiff", imageCategoryData }, { "image/x-pcx", imageCategoryData }, { "image/x-xcf", imageCategoryData }, { "image/x-psd", imageCategoryData }, { "image/x-portable-bitmap", imageCategoryData }, { "image/x-portable-anymap", imageCategoryData }, { "image/svg+xml", imageCategoryData }, { "image/x-ico", imageCategoryData }, { "image/x-icns", imageCategoryData }, { "image/x-panasonic-raw", imageCategoryData }, /* applications */ { "application/x-executable", applicationCategoryData }, { "application/x-shellscript", applicationCategoryData }, { "application/x-ms-dos-executable", applicationCategoryData }, { "application/x-msdownload", applicationCategoryData }, /* archives */ { "application/x-tar", archiveCategoryData }, { "application/zip", archiveCategoryData }, { "application/x-rar", archiveCategoryData }, { "application/x-bzip-compressed-tar", archiveCategoryData }, { "application/x-compressed-tar", archiveCategoryData }, { "application/x-gzip", archiveCategoryData }, { "application/x-deb", archiveCategoryData }, { "application/x-rpm", archiveCategoryData }, { "application/x-java-archive", archiveCategoryData }, /* development */ { "text/x-csrc", developmentCategoryData }, { "text/x-c++src", developmentCategoryData }, { "text/x-python", developmentCategoryData }, { "text/x-csharp", developmentCategoryData }, { "text/x-java", developmentCategoryData }, { "text/x-sql", developmentCategoryData }, }; return mapping; } } } Basenji/src/App.cs0000664000175000017500000000514512067326706014163 0ustar patrickpatrick// App.cs // // Copyright (C) 2008 - 2010 Patrick Ulbrich // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // using System; using System.IO; using System.Reflection; namespace Basenji { /* static class providing several info about the application */ static class App { // search result limit, // limits the result size in the item search window public const int SEARCH_RESULTS_LIMIT = 10000; public const string APP_DATA_PATH = "data"; // path to app data like images public static readonly string CUSTOM_THEME_PATH = Path.Combine(APP_DATA_PATH, "themes"); private static string name; private static string version; private static string copyright; private static Settings settings; private static string defaultDB; private static Gdk.Pixbuf defaultIcon; static App() { Assembly asm = Assembly.GetExecutingAssembly(); name = asm.GetName().Name; version = asm.GetName().Version.ToString(); object[] attr = asm.GetCustomAttributes(typeof(AssemblyCopyrightAttribute), false); copyright = ((AssemblyCopyrightAttribute)attr[0]).Copyright; settings = null; // lazy initialized defaultDB = null; // lazy initialied as well (depends on lazy initialized Settings) } public static string Name { get { return name; } } public static string Version { get { return version; } } public static string Copyright { get { return copyright; } } public static Settings Settings { get { if (settings == null) settings = new Settings(); return settings; } } public static string DefaultDB { get { if (defaultDB == null) { defaultDB = Path.Combine( Settings.GetSettingsDirectory().FullName, "volumes.vdb" ); } return defaultDB; } } public static Gdk.Pixbuf DefaultWindowIcon { get { if (defaultIcon == null) defaultIcon = new Gdk.Pixbuf(APP_DATA_PATH + "/basenji.svg"); return defaultIcon; } } } }Basenji/src/S.cs0000664000175000017500000000314212067326706013640 0ustar patrickpatrick// S.cs // // Copyright (C) 2008, 2009, 2011 Patrick Ulbrich // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // using System; using System.Globalization; using System.Reflection; using Platform.Common.Globalization; namespace Basenji { // shorthand to Catalog.GetString() internal static class S { private static Catalog c; private static string ns; static S() { ns = String.Format("{0}.{1}", Assembly.GetCallingAssembly().GetName().Name, "po"); c = Catalog.GetCatalogForCulture(CultureInfo.CurrentUICulture, ns, true); } public static void SetCulture(CultureInfo ci) { if (ci == null) throw new ArgumentNullException("ci"); c = Catalog.GetCatalogForCulture(ci, ns, true); } public static void SetCulture(string name) { if (name == null) throw new ArgumentNullException("name"); c = Catalog.GetCatalogForCulture(name, ns, true); } public static string _(string msgid) { return c.GetString(msgid); } } } Basenji/src/MsgDialog.cs0000664000175000017500000000402612067326706015306 0ustar patrickpatrick// MsgDialog.cs // // Copyright (C) 2008 Patrick Ulbrich // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // using System; using Gtk; namespace Basenji { public static class MsgDialog { public static ResponseType Show(Window parentWindow, DialogFlags flags, MessageType type, ButtonsType bt, bool useMarkup, string title, string format, params object[] args) { if (args == null) args = new object[0]; MessageDialog md = new MessageDialog(parentWindow, flags, type, bt, useMarkup, format, args); md.Title = title; int result = md.Run(); md.Destroy(); return (ResponseType)result; } public static ResponseType Show(Window parentWindow, MessageType type, ButtonsType bt, string title, string format, params object[] args) { return Show(parentWindow, DialogFlags.Modal | DialogFlags.DestroyWithParent, type, bt, false, title, format, args); } public static ResponseType Show(Window parentWindow, MessageType type, ButtonsType bt, string title, string format) { return Show(parentWindow, type, bt, title, format, null); } public static void ShowError(Window parentWindow, string title, string format, params object[] args) { Show(parentWindow, DialogFlags.Modal | DialogFlags.DestroyWithParent, MessageType.Error, ButtonsType.Ok, false, title, format, args); } public static void ShowError(Window parentWindow, string title, string format) { ShowError(parentWindow, title, format, null); } } } Basenji/src/PathUtil.cs0000664000175000017500000000345412067326706015176 0ustar patrickpatrick// PathUtil.cs // // Copyright (C) 2008, 2010 Patrick Ulbrich // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // using System; using System.IO; using VolumeDB; namespace Basenji { // // paths to external db data like logs, thumbnails public static class PathUtil { public static string GetDbDataPath(VolumeDatabase db) { string settingsPath = App.Settings.GetSettingsDirectory().FullName; string guid = db.GetDBProperties().Guid; string dataPath = Path.Combine(Path.Combine(settingsPath, "dbdata"), guid); if (!Directory.Exists(dataPath)) Directory.CreateDirectory(dataPath); return dataPath; } public static Gdk.Pixbuf GetThumb(VolumeItem item, VolumeDatabase db, int size) { string dbDataPath = PathUtil.GetDbDataPath(db); string volumeDataPath = DbData.GetVolumeDataPath(dbDataPath, item.VolumeID); string thumbsPath = DbData.GetVolumeDataThumbsPath(volumeDataPath); string thumbName = System.IO.Path.Combine( thumbsPath, string.Format("{0}.png", item.ItemID)); if (File.Exists(thumbName)) { if (size > 0) return new Gdk.Pixbuf(thumbName, size, size, false); else return new Gdk.Pixbuf(thumbName); } else { return null; } } } } Basenji/src/FileDialog.cs0000664000175000017500000000405012067326706015434 0ustar patrickpatrick// FileDialog.cs // // Copyright (C) 2008 Patrick Ulbrich // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // using System; using Gtk; using Basenji.Gui.Base; namespace Basenji { public static class FileDialog { public static ResponseType Show(FileChooserAction action, Window parent, string title, out string filename) { FileChooserDialog fc = null; switch(action) { case FileChooserAction.Open: fc = new FileChooserDialog(title, parent, FileChooserAction.Open, Stock.Cancel, ResponseType.Cancel, Stock.Open, ResponseType.Ok); break; case FileChooserAction.Save: fc = new FileChooserDialog(title, parent, FileChooserAction.Save, Stock.Cancel, ResponseType.Cancel, Stock.Save, ResponseType.Ok); break; case FileChooserAction.CreateFolder: throw new NotImplementedException(); case FileChooserAction.SelectFolder: throw new NotImplementedException(); } fc.SetCurrentFolder(Environment.GetFolderPath(Environment.SpecialFolder.Personal)); fc.Modal = true; fc.DestroyWithParent = true; fc.SkipTaskbarHint = true; fc.Icon = App.DefaultWindowIcon; FileFilter ff; ff = new FileFilter(); ff.Name = S._("VolumeDatabase files"); ff.AddPattern("*.vdb"); fc.AddFilter(ff); ff = new FileFilter(); ff.Name = S._("All files"); ff.AddPattern("*.*"); fc.AddFilter(ff); ResponseType r = (ResponseType)fc.Run(); filename = fc.Filename; fc.Destroy(); return r; } } } Basenji/src/AssemblyInfo.cs0000664000175000017500000000351112067326706016031 0ustar patrickpatrick// AssemblyInfo.cs // // Copyright (C) 2008 - 2012 Patrick Ulbrich // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // using System.Reflection; using System.Runtime.CompilerServices; // Information about this assembly is defined by the following // attributes. // // change them to the information which is associated with the assembly // you compile. [assembly: AssemblyTitle("Basenji")] [assembly: AssemblyDescription("A cross-platform media indexing/search tool")] [assembly: AssemblyConfiguration("")] [assembly: AssemblyCompany("")] [assembly: AssemblyProduct("")] [assembly: AssemblyCopyright("2008 - 2012 Patrick Ulbrich")] [assembly: AssemblyTrademark("")] [assembly: AssemblyCulture("")] // The assembly version has following format : // // Major.Minor.Build.Revision // // You can specify all values by your own or you can build default build and revision // numbers with the '*' character (the default): [assembly: AssemblyVersion("1.0.1")] // The following attributes specify the key for the sign of your assembly. See the // .NET Framework documentation for more information about signing. // This is not required, if you don't want signing let these attributes like they're. [assembly: AssemblyDelaySign(false)] [assembly: AssemblyKeyFile("")] Basenji/src/App.cs.in0000664000175000017500000000517112067326706014567 0ustar patrickpatrick// App.cs // // Copyright (C) 2008 - 2010 Patrick Ulbrich // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // using System; using System.IO; using System.Reflection; namespace Basenji { /* static class providing several info about the application */ static class App { // search result limit, // limits the result size in the item search window public const int SEARCH_RESULTS_LIMIT = 10000; public const string APP_DATA_PATH = "@expanded_datadir@/@PACKAGE@"; // path to app data like images public static readonly string CUSTOM_THEME_PATH = Path.Combine(APP_DATA_PATH, "themes"); private static string name; private static string version; private static string copyright; private static Settings settings; private static string defaultDB; private static Gdk.Pixbuf defaultIcon; static App() { Assembly asm = Assembly.GetExecutingAssembly(); name = asm.GetName().Name; version = asm.GetName().Version.ToString(); object[] attr = asm.GetCustomAttributes(typeof(AssemblyCopyrightAttribute), false); copyright = ((AssemblyCopyrightAttribute)attr[0]).Copyright; settings = null; // lazy initialized defaultDB = null; // lazy initialied as well (depends on lazy initialized Settings) } public static string Name { get { return name; } } public static string Version { get { return version; } } public static string Copyright { get { return copyright; } } public static Settings Settings { get { if (settings == null) settings = new Settings(); return settings; } } public static string DefaultDB { get { if (defaultDB == null) { defaultDB = Path.Combine( Settings.GetSettingsDirectory().FullName, "volumes.vdb" ); } return defaultDB; } } public static Gdk.Pixbuf DefaultWindowIcon { get { if (defaultIcon == null) defaultIcon = new Gdk.Pixbuf(APP_DATA_PATH + "/basenji.svg"); return defaultIcon; } } } } Basenji/src/Icons/0000775000175000017500000000000012067326706014162 5ustar patrickpatrickBasenji/src/Icons/IconUtils.cs0000664000175000017500000000500012067326706016415 0ustar patrickpatrick// IconUtils.cs // // Copyright (C) 2008 Patrick Ulbrich // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // using System; using Gtk; using Platform.Common.IO; //using Platform.Common.Diagnostics; namespace Basenji.Icons { public static class IconUtils { public static int GetIconSizeVal(IconSize size) { int sz; switch (size) { case Gtk.IconSize.Button: sz = 24; break; case Gtk.IconSize.Dialog: sz = 48; break; case Gtk.IconSize.Dnd: sz = 32; break; case Gtk.IconSize.LargeToolbar: sz = 24; break; case Gtk.IconSize.Menu: sz = 16; break; case Gtk.IconSize.SmallToolbar: sz = 18; break; default: sz = 16; break; } return sz; } // keep in sync with VolumeView.GetVolumeIcon() public static Icons.Icon GetDriveIcon(DriveInfo d) { //// DriveInfo.DriveType is not supported on linux //if (CurrentPlatform.IsUnix) // return Stock.Harddisk; Icons.Icon icon; switch(d.DriveType) { case DriveType.CDRom: //name = Gtk.Stock.Cdrom; icon = Icons.Icon.Stock_Cdrom; break; case DriveType.Fixed: //name = Gtk.Stock.Harddisk; icon = Icons.Icon.Stock_Harddisk; break; case DriveType.Ram: //name = Gtk.Stock.Harddisk; // FIXME : is there a more suitable icon? icon = Icons.Icon.Stock_Harddisk; // FIXME : is there a more suitable icon? break; case DriveType.Network: //name = Gtk.Stock.Network; icon = Icons.Icon.Stock_Network; break; case DriveType.Removable: //name = "drive-removable-media"; icon = Icons.Icon.DriveRemovableMedia; break; case DriveType.Unknown: //name = Gtk.Stock.Harddisk; // FIXME : is there a more suitable icon? icon = Icons.Icon.Stock_Harddisk; // FIXME : is there a more suitable icon? break; default: throw new Exception("Invalid DriveType."); } return icon; } } } Basenji/src/Icons/CustomIconThemeMimeMapping.cs0000664000175000017500000000400412067326706021701 0ustar patrickpatrick// CustomIconThemeMimeMapping.cs // // Copyright (C) 2010, 2012 Patrick Ulbrich // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // using System; using System.Collections.Generic; using Gdk; namespace Basenji.Icons { // basic support for custom mimetype icons public class CustomIconThemeMimeMapping { // mimetype -> custom mime icon mapping // (maps mimetypes to icons that are actually available in the custom icon theme) private readonly Dictionary MIME_MAPPING = MimeCategoryMapping .GetMapping(/*directoryCategoryData:*/ Icon.Stock_Directory, /*textCategoryData:*/ Icon.Category_Texts, /*documentCategoryData:*/ Icon.Category_Documents, /*musicCategoryData:*/ Icon.Category_Music, /*movieCategoryData:*/ Icon.Category_Movies, /*imageCategoryData:*/ Icon.Category_Images, /*applicationCategoryData:*/ Icon.Category_Applications, /*archiveCategoryData:*/ Icon.Category_Archives, /*textCategoryData:*/ Icon.Category_Texts); public bool TryGetIconForMimeType(string mimeType, out Icon icon) { if (mimeType == null) throw new ArgumentNullException("mimeType"); if (mimeType.Length == 0) throw new ArgumentException("Argument is emtpy", "mimeType"); return MIME_MAPPING.TryGetValue(mimeType, out icon); } } } Basenji/src/Icons/Icon.cs0000664000175000017500000001434112067326706015404 0ustar patrickpatrick// Icon.cs // // Copyright (C) 2008 - 2012 Patrick Ulbrich // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // using System; using Gdk; using Gtk; using Platform.Common.Diagnostics; namespace Basenji.Icons { // all icons used in this app // (except icons loaded by mime-type dynamically) public struct Icon { // fields private string name; private Icon(string name) { this.name = name; } public string Name { get { return name; } } [NameInCustomIconTheme("properties.png")] public static Icon Stock_Properties { get { return new Icon(Stock.Properties); } } [NameInCustomIconTheme("find.png")] public static Icon Stock_Find { get { return new Icon(Stock.Find); } } [NameInCustomIconTheme("add.png")] public static Icon Stock_Add { get { return new Icon(Stock.Add); } } [NameInCustomIconTheme("remove.png")] public static Icon Stock_Remove { get { return new Icon(Stock.Remove); } } [NameInCustomIconTheme("edit.png")] public static Icon Stock_Edit { get { return new Icon(Stock.Edit); } } [NameInCustomIconTheme("refresh.png")] public static Icon Stock_Refresh { get { return new Icon(Stock.Refresh); } } [NameInCustomIconTheme("new.png")] public static Icon Stock_New { get { return new Icon(Stock.New); } } [NameInCustomIconTheme("open.png")] public static Icon Stock_Open { get { return new Icon(Stock.Open); } } [NameInCustomIconTheme("preferences.png")] public static Icon Stock_Preferences { get { return new Icon(Stock.Preferences); } } [NameInCustomIconTheme("quit.png")] public static Icon Stock_Quit { get { return new Icon(Stock.Quit); } } [NameInCustomIconTheme("about.png")] public static Icon Stock_About { get { return new Icon(Stock.About); } } [NameInCustomIconTheme("drive-cdrom.png")] public static Icon Stock_Cdrom { get { return new Icon(Stock.Cdrom); } } [NameInCustomIconTheme("drive-harddisk.png")] public static Icon Stock_Harddisk { get { return new Icon(Stock.Harddisk); } } [NameInCustomIconTheme("drive-removable-media.png")] public static Icon DriveRemovableMedia { get { return new Icon("drive-removable-media"); } } [NameInCustomIconTheme("drive-network.png")] public static Icon Stock_Network { get { return new Icon("folder-remote"); } } [NameInCustomIconTheme("file.png")] public static Icon Stock_File { get { return new Icon(Stock.File); } } [NameInCustomIconTheme("directory.png")] public static Icon Stock_Directory { get { return new Icon(Stock.Directory); } } [NameInCustomIconTheme("symbolic-link.png")] public static Icon SymLink { get { return new Icon("emblem-symbolic-link"); } } [NameInCustomIconTheme("clear.png")] public static Icon Stock_Clear { get { return new Icon(Stock.Clear); } } [NameInCustomIconTheme("cancel.png")] public static Icon Stock_Cancel { get { return new Icon(Stock.Cancel); } } [NameInCustomIconTheme("close.png")] public static Icon Stock_Close { get { return new Icon(Stock.Close); } } [NameInCustomIconTheme("dialog-info.png")] public static Icon Stock_DialogInfo { get { return new Icon(Stock.DialogInfo); } } [NameInCustomIconTheme("dialog-warning.png")] public static Icon Stock_DialogWarning { get { return new Icon(Stock.DialogWarning); } } [NameInCustomIconTheme("dialog-error.png")] public static Icon Stock_DialogError { get { return new Icon(Stock.DialogError); } } [NameInCustomIconTheme("dialog-question.png")] public static Icon Stock_DialogQuestion { get { return new Icon(Stock.DialogQuestion); } } // icons used by the page navigation widget [NameInCustomIconTheme("go_previous.png")] public static Icon Stock_GoBack { get { return new Icon(Stock.GoBack); } } [NameInCustomIconTheme("go_next.png")] public static Icon Stock_GoForward { get { return new Icon(Stock.GoForward); } } // icons used by the cateroyview widget (and the CustomIconThemeMimeMapping class): [NameInCustomIconTheme("text.png")] public static Icon Category_Texts { get { return new Icon("text-x-generic"); } } [NameInCustomIconTheme("document.png")] public static Icon Category_Documents { get { return new Icon("x-office-document"); } } [NameInCustomIconTheme("audio.png")] public static Icon Category_Music { get { return new Icon("audio-x-generic"); } } [NameInCustomIconTheme("video.png")] public static Icon Category_Movies { get { return new Icon("video-x-generic"); } } [NameInCustomIconTheme("image.png")] public static Icon Category_Images { get { return new Icon("image-x-generic"); } } [NameInCustomIconTheme("application.png")] public static Icon Category_Applications { get { return new Icon("application-x-executable"); } } [NameInCustomIconTheme("archive.png")] public static Icon Category_Archives { get { return new Icon("package-x-generic"); } } [NameInCustomIconTheme("development.png")] public static Icon Category_Development { get { return new Icon("applications-development"); } } public Pixbuf Render(Widget w, Gtk.IconSize size) { // most basenji icons are gtk stock icons, // so try to render the icon via widget.RenderIcon() first // (RenderIcon return null if the stock_id wasn't knwon) Pixbuf pb = w.RenderIcon(this.name, size, string.Empty); if (pb == null) { // try to render the icon via Gtk.IconTheme if (Gtk.IconTheme.Default.HasIcon(this.name)) { pb = Gtk.IconTheme.Default.LoadIcon(this.name, IconUtils.GetIconSizeVal(size), 0); } else { Debug.WriteLine(string.Format("Icon.Render(): Failed to render icon \"{0}\"", this.name)); } } return pb; } } }Basenji/src/Icons/MimeIconCache.cs0000664000175000017500000000625512067326706017145 0ustar patrickpatrick// MimeIconCache.cs // // Copyright (C) 2008 - 2012 Patrick Ulbrich // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // using System; using System.Collections.Generic; using Platform.Common.Mime; using Gdk; using Gtk; namespace Basenji.Icons { // caches already rendered mime icon pixbufs public class MimeIconCache { private bool useCustomMimeIcons; private MimeIconLookup mimeIconLookup; private CustomIconThemeMimeMapping customMimeMapping; private Dictionary mimeIconCache; private Dictionary fallbackIcons; private Icon defaultIcon; private Widget widget; public MimeIconCache(Widget w, bool useCustomMimeIcons, Icon defaultIcon, Dictionary fallbackIcons) { this.widget = w; this.useCustomMimeIcons = useCustomMimeIcons; if (useCustomMimeIcons) customMimeMapping = new CustomIconThemeMimeMapping(); else mimeIconLookup = new MimeIconLookup(); mimeIconCache = new Dictionary(); if (fallbackIcons == null) this.fallbackIcons = new Dictionary(); else this.fallbackIcons = fallbackIcons; this.defaultIcon = defaultIcon; } public void Clear() { mimeIconCache.Clear(); } public Pixbuf GetIcon(string mimeType, Gtk.IconSize size) { if (mimeType == null) throw new ArgumentNullException("mimeType"); if (mimeType.Length == 0) throw new ArgumentException("Argument is emtpy", "mimeType"); Pixbuf pb; string iconKey = mimeType + (int)size; if (mimeIconCache.TryGetValue(iconKey, out pb)) return pb; if (useCustomMimeIcons) { // render icons which are available in the custom theme Icon icon; if (customMimeMapping.TryGetIconForMimeType(mimeType, out icon)) pb = icon.Render(widget, size); else pb = defaultIcon.Render(widget, size); } else { // render system mime icons dynamically string iconName = mimeIconLookup.GetIconNameForMimeType(mimeType); if (!string.IsNullOrEmpty(iconName) && Gtk.IconTheme.Default.HasIcon(iconName)) { pb = Gtk.IconTheme.Default.LoadIcon(iconName, IconUtils.GetIconSizeVal(size), 0); } else { Icon fbIcon; if (fallbackIcons.TryGetValue(mimeType, out fbIcon)) { iconName = fbIcon.Name; pb = fbIcon.Render(widget, size); } else { pb = defaultIcon.Render(widget, size); iconName = defaultIcon.Name; } } } if (pb != null) mimeIconCache.Add(iconKey, pb); return pb; } } } Basenji/src/Icons/CustomIconTheme.cs0000664000175000017500000001456112067326706017566 0ustar patrickpatrick// CustomIconTheme.cs // // Copyright (C) 2008 Patrick Ulbrich // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // // TODO: faster? more mem usage? longer startup? /*#define LOAD_PIXBUFS*/ using System; using System.IO; using System.Collections.Generic; using System.Reflection; using Gtk; using Gdk; using Platform.Common.Diagnostics; namespace Basenji.Icons { public static class CustomIconTheme { public static void Load(string themePath) { if (themePath == null) throw new ArgumentNullException("themePath"); if (themePath.Length == 0) throw new ArgumentException("Argument is empty", "themePath"); // gtk requires an absolute path if (!Path.IsPathRooted(themePath)) throw new ArgumentException("Path must be absolute", "themePath"); if (!Directory.Exists(themePath)) throw new DirectoryNotFoundException(string.Format("Path to theme \"{0}\" not found", themePath)); //IconSize[] iconSizes = (IconSize[])Enum.GetValues(typeof(IconSize)); // all icon sizes the app uses IconSize[] iconSizes = { IconSize.Menu, /* 16px */ IconSize.LargeToolbar, /* 24px */ IconSize.Button, /* 24px */ IconSize.Dialog /* 48px */ }; Dictionary iconNames = GetAllIconNames(); IconFactory fac = new IconFactory(); foreach (KeyValuePair namePair in iconNames) { string name = namePair.Key; string nameInCustomTheme = namePair.Value; IconSet iconSet = new IconSet(); bool setHasSources = false; foreach (Gtk.IconSize size in iconSizes) { int sz = IconUtils.GetIconSizeVal(size); string fullPath = Path.Combine(Path.Combine(themePath, sz.ToString()), nameInCustomTheme); if (!File.Exists(fullPath)) { if (Global.EnableDebugging) { Debug.WriteLine(string.Format("IconTheme: could not find custom icon for \"{0}\" (size = {1}), using system default", name, sz)); } continue; } IconSource source = new IconSource(); #if LOAD_PIXBUFS source.Pixbuf = new Gdk.Pixbuf(fullPath); #else source.Filename = fullPath; #endif source.Size = size; //source.IconName = name; source.SizeWildcarded = false; iconSet.AddSource(source); setHasSources = true; } if (setHasSources) fac.Add(name, iconSet); } fac.AddDefault(); // add icon factory to the apps default factories } private static Dictionary GetAllIconNames() { Dictionary names = new Dictionary(); Type t = typeof(Icons.Icon); PropertyInfo[] propInfos = t.GetProperties(BindingFlags.Static | BindingFlags.Public); foreach(PropertyInfo pi in propInfos) { if (pi.PropertyType == typeof(Icons.Icon)) { // get default name Icon icon = (Icon)pi.GetValue(null, null); // get name in a custom theme object[] attribs = pi.GetCustomAttributes(typeof(Icons.NameInCustomIconThemeAttribute), true); if (attribs.Length == 0) throw new NotImplementedException(string.Format("Property \"{0}\" does not have the NameInCustomIconThemeAttribute", pi.Name)); Icons.NameInCustomIconThemeAttribute attr = (Icons.NameInCustomIconThemeAttribute)attribs[0]; names.Add(icon.Name, attr.Name); } } return names; } } // public static class IconLoader // { // private static string customThemePath; // // private static bool enableCaching; // private static Dictionary iconCache; // // static IconLoader() { // enableCaching = false; // iconCache = new Dictionary(); // } // // public static string CustomThemePath { // get { return customThemePath; } // set { customThemePath = value; } // } // // public static bool EnableCaching { // get { return enableCaching; } // set { enableCaching = value; } // } // // public static void ClearCache() { // iconCache.Clear(); // } // // public static Pixbuf LoadIcon(string name, Gtk.IconSize size) { // Pixbuf icon; // int sz = GetSize(size); // string iconKey = name + sz; // // if (enableCaching && iconCache.TryGetValue(iconKey, out icon)) // return icon; // // if (string.IsNullOrEmpty(customThemePath)) // icon = LoadIconFromSystemTheme(name, sz); // use system theme // else // icon = LoadIconFromCustomTheme(name, sz); // // if (enableCaching) { // iconCache.Add(iconKey, icon); // Debug.WriteLine(string.Format("IconLoader cached icon \"{0}\" (size = {1})", name, sz)); // } // // return icon; // } // // private static Pixbuf LoadIconFromSystemTheme(string name, int size) { // return Gtk.IconTheme.Default.LoadIcon(name, size, 0); // } // // private static Pixbuf LoadIconFromCustomTheme(string name, int size) { // if (!Directory.Exists(customThemePath)) // throw new DirectoryNotFoundException(string.Format("Path to custom theme \"{0}\" not found", customThemePath)); // // string iconPath = Path.Combine(Path.Combine(customThemePath, size.ToString()), name); // return new Pixbuf(iconPath); // } // // private static int GetSize(Gtk.IconSize size) { // int sz; // switch (size) { // case Gtk.IconSize.Button: // sz = 20; // break; // case Gtk.IconSize.Dialog: // sz = 48; // break; // case Gtk.IconSize.Dnd: // sz = 32; // break; // case Gtk.IconSize.LargeToolbar: // sz = 24; // break; // case Gtk.IconSize.Menu: // sz = 16; // break; // case Gtk.IconSize.SmallToolbar: // sz = 18; // break; // default: // sz = 16; // break; // } // return sz; // } // } } Basenji/src/Icons/NameInCustomIconThemeAttribute.cs0000664000175000017500000000204312067326706022532 0ustar patrickpatrick// NameInCustomIconThemeAttribute.cs // // Copyright (C) 2008, 2010 Patrick Ulbrich // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // using System; namespace Basenji.Icons { [AttributeUsage(AttributeTargets.Property)] public class NameInCustomIconThemeAttribute : Attribute { private string name; public NameInCustomIconThemeAttribute(string name) : base() { this.name = name; } public string Name { get { return name; } } } } Basenji/src/Icons/ItemIcons.cs0000664000175000017500000000376312067326706016414 0ustar patrickpatrick// ItemIcons.cs // // Copyright (C) 2008 - 2012 Patrick Ulbrich // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // using System; using System.Collections.Generic; using Gtk; using VolumeDB; namespace Basenji.Icons { /* class that looks up icons for * VolumeDatabase items (e.g. files, folders, ...) */ public class ItemIcons { private readonly Icons.Icon DEFAULT_ICON = Icon.Stock_File; private MimeIconCache mimeIconCache; private IconCache iconCache; public ItemIcons(Widget w) { // create a cache for item icons iconCache = new IconCache(w); bool useCustomMimeIcons = !string.IsNullOrEmpty(App.Settings.CustomThemeName); // create a cache for mime icons and add default and fallback icons // for platforms where mime icons are not implemented mimeIconCache = new MimeIconCache(w, useCustomMimeIcons, DEFAULT_ICON, new Dictionary() { { "x-directory/normal", Icon.Stock_Directory } }); } public Gdk.Pixbuf GetIconForItem(VolumeItem item, Gtk.IconSize iconSize) { Gdk.Pixbuf pb; if ((item is FileSystemVolumeItem) && (((FileSystemVolumeItem)item).IsSymLink)) { return iconCache.GetIcon(Icon.SymLink, iconSize); } string mimeType = item.MimeType; if (string.IsNullOrEmpty(mimeType)) pb = iconCache.GetIcon(DEFAULT_ICON, iconSize); else pb = mimeIconCache.GetIcon(mimeType, iconSize); return pb; } } } Basenji/src/Icons/IconCache.cs0000664000175000017500000000306712067326706016333 0ustar patrickpatrick// IconCache.cs // // Copyright (C) 2008 Patrick Ulbrich // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // using System; using System.Collections.Generic; using Gdk; using Gtk; //using Platform.Common.Diagnostics; namespace Basenji.Icons { // caches already rendered pixbufs public class IconCache { private Dictionary iconCache; private Widget widget; public IconCache(Widget w) { widget = w; iconCache = new Dictionary(); } public void Clear() { iconCache.Clear(); } public Pixbuf GetIcon(Icons.Icon icon, IconSize size) { Pixbuf pb; string iconKey = icon.Name + (int)size; if (iconCache.TryGetValue(iconKey, out pb)) return pb; pb = icon.Render(widget, size); if (pb == null) return null; iconCache.Add(iconKey, pb); //Debug.WriteLine(string.Format("IconCache: cached icon \"{0}\" (size = {1})", icon.Name, IconUtils.GetIconSizeVal(size))); return pb; } } } Basenji/src/Main.cs0000664000175000017500000001015712067326706014326 0ustar patrickpatrick// Main.cs // // Copyright (C) 2008 - 2011 Patrick Ulbrich // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // using System; using System.Collections.Generic; using Gtk; using Platform.Common.Diagnostics; using NDesk.Options; namespace Basenji { class MainClass { public static void Main (string[] args) { string dbPath; bool debug; if (!GetOptions(args, out dbPath, out debug)) return; if (debug) { Basenji.Global.EnableDebugging = true; VolumeDB.Global.EnableDebugging = true; } if (!string.IsNullOrEmpty(App.Settings.EnforceCulture)) { Basenji.Global.EnforceCulture(App.Settings.EnforceCulture); VolumeDB.Global.EnforceCulture(App.Settings.EnforceCulture); } Debug.WriteLine(string.Format("{0} {1}", App.Name, App.Version)); Debug.WriteLine(string.Format("Used runtime: {0}", System.Runtime.InteropServices.RuntimeEnvironment.GetRuntimeDirectory())); if (CurrentPlatform.IsUnix) Util.SetProcName(App.Name.ToLower()); Application.Init(); // see http://bugzilla.ximian.com/show_bug.cgi?id=77130 if (!GLib.Thread.Supported) GLib.Thread.Init(); using (new InstanceLock()) { // load custom icon theme string themeName = App.Settings.CustomThemeName; if (!string.IsNullOrEmpty(themeName)) { string path = System.IO.Path.Combine(App.CUSTOM_THEME_PATH, themeName); string fullPath = System.IO.Path.GetFullPath(path); Icons.CustomIconTheme.Load(fullPath); } Gui.MainWindow win = new Gui.MainWindow (dbPath); Gui.Base.WindowBase.MainWindow = win; win.Show(); Application.Run(); } } private static bool GetOptions(string[] args, out string dbPath, out bool debug) { bool show_help = false; string optDbPath = null; bool optDebug = false; dbPath = optDbPath; debug = optDebug; // parse options var p = new OptionSet() { { "g|debug", "enable debugging output", v => optDebug = (v != null) }, { "d|database=", "path of database to open", (string v) => optDbPath = v }, /* help */ { "h|help", "show this message and exit", v => show_help = (v != null) } }; try { List extra = p.Parse(args); if (extra.Count > 0) throw new OptionException(string.Format("Unknown option: {0}", extra[0]), extra[0]); } catch (OptionException e) { Console.Write(string.Format("{0}: ", App.Name)); Console.WriteLine(e.Message); Console.WriteLine(string.Format("Try `{0}: --help' for more information.", App.Name.ToLower())); return false; } if (show_help) { ShowHelp(p); return false; } dbPath = optDbPath; debug = optDebug; return true; } private static void ShowHelp(OptionSet p) { Console.WriteLine (string.Format("Usage: {0} [OPTIONS]", App.Name.ToLower())); Console.WriteLine (); Console.WriteLine ("Options:"); p.WriteOptionDescriptions (Console.Out); } // allows only one instance of the app private class InstanceLock : IDisposable { private System.Threading.Mutex mtx; public InstanceLock() { mtx = new System.Threading.Mutex(false, "715829bd-de3b-44c0-8bbc-a542eec8d8be"); if (!mtx.WaitOne(1, true)) { MsgDialog.Show(null, MessageType.Error, ButtonsType.Ok, S._("Error"), string.Format(S._("{0} is already running."), App.Name)); Environment.Exit(0); } } public void Dispose() { mtx.ReleaseMutex(); mtx.Close(); } } } }Basenji/src/Gui/0000775000175000017500000000000012067326706013633 5ustar patrickpatrickBasenji/src/Gui/Widgets/0000775000175000017500000000000012067326706015241 5ustar patrickpatrickBasenji/src/Gui/Widgets/InfoBar.cs0000664000175000017500000000453112067326706017113 0ustar patrickpatrick// InfoBar.cs // // Copyright (C) 2012 Patrick Ulbrich // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // using System; using Gtk; using Basenji.Gui.Base; namespace Basenji.Gui.Widgets { // TODO : remove this class and // use the native GtkInfoBar when it's available in Gtk# public partial class InfoBar : BinBase { private string headline; private string text; public InfoBar () { headline = string.Empty; text = string.Empty; BuildGui(); } public string Headline { get { return headline; } set { headline = value; lblHeadline.Markup = string.Format("{0}", headline); } } public string Text { get { return text; } set { text = value; lblText.Markup = text; } } } public partial class InfoBar : BinBase { private Label lblHeadline; private Label lblText; protected override void BuildGui () { Gdk.Pixbuf pb = Basenji.Icons.Icon.Stock_DialogInfo.Render(this, IconSize.Dialog); Image img = new Image(pb); lblHeadline = WindowBase.CreateLabel(string.Empty, true); lblText = WindowBase.CreateLabel(string.Empty, true); VBox vbMsg = new VBox(false, 3); vbMsg.PackStart(lblHeadline, false, false, 0); vbMsg.PackStart(lblText, false, false, 0); HBox outerBox = new HBox(false, 12); outerBox.BorderWidth = 6; outerBox.PackStart(img, false, false, 0); outerBox.PackStart(vbMsg, true, true, 0); // (Gtk.Frame derives from Gtk.Bin which has no window) Frame frame = new Frame(); frame.Add(outerBox); // the Eventbox is needed for the modified background color EventBox eb = new EventBox(); eb.ModifyBg(StateType.Normal, new Gdk.Color(0xFC, 0xFC, 0xBD)); eb.Add(frame); this.Add(eb); } } } Basenji/src/Gui/Widgets/IconEntry.cs0000664000175000017500000001100512067326706017477 0ustar patrickpatrick// IconEntry.cs // // Copyright (C) 2009 Patrick Ulbrich // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // using System; using System.Runtime.InteropServices; using GLib; using Gtk; namespace Basenji.Gui.Widgets { // Temporary hack that enables icons in Gtk's 2.16 Entry widget. // This file can be removed when gtk# 2.16 bindings are ready. public class IconEntry : Entry { public void SetIconFromStock(string stockIcon, EntryIconPosition iconPos) { if (IconsSupported) gtk_entry_set_icon_from_stock(this.Handle, iconPos, stockIcon); } public void SetIconFromPixbuf(Gdk.Pixbuf pb, EntryIconPosition iconPos) { if (IconsSupported) gtk_entry_set_icon_from_pixbuf(this.Handle, iconPos, pb.Handle); } public void SetIconActivatable(EntryIconPosition iconPos, bool activatable) { if (IconsSupported) gtk_entry_set_icon_activatable(this.Handle, iconPos, activatable); } private bool? iconsSupported = null; public bool IconsSupported { get { if (!iconsSupported.HasValue) { try { gtk_entry_get_icon_at_pos(this.Handle, 0, 0); iconsSupported = true; } catch (EntryPointNotFoundException) { iconsSupported = false; } catch (DllNotFoundException) { iconsSupported = false; } } return iconsSupported.Value; } } [Signal("icon_press")] public event IconPressReleaseEventHandler IconPress { add { Signal.Lookup(this, "icon_press", new SignalCallbackDelegate(IconEntry.SignalCallback) ).AddDelegate(value); } remove { Signal.Lookup(this, "icon_press", new SignalCallbackDelegate(IconEntry.SignalCallback) ).RemoveDelegate(value); } } [Signal("icon_release")] public event IconPressReleaseEventHandler IconRelease { add { Signal.Lookup(this, "icon_release", new SignalCallbackDelegate(IconEntry.SignalCallback) ).AddDelegate(value); } remove { Signal.Lookup(this, "icon_release", new SignalCallbackDelegate(IconEntry.SignalCallback) ).AddDelegate(value); } } [CDeclCallback] private delegate void SignalCallbackDelegate(IntPtr arg0, int arg1, IntPtr arg2, IntPtr gch); private static void SignalCallback(IntPtr arg0, int arg1, IntPtr arg2, IntPtr gch) { IconPressReleaseEventArgs args = new IconPressReleaseEventArgs(); try { GCHandle handle = (GCHandle) gch; Signal target = handle.Target as Signal; if (target == null) { throw new Exception("Unknown signal GC handle received " + gch); } args.Args = new object[] { arg1 }; IconPressReleaseEventHandler handler = (IconPressReleaseEventHandler)target.Handler; handler(GLib.Object.GetObject(arg0), args); } catch (Exception exception) { ExceptionManager.RaiseUnhandledException(exception, false); } } [DllImport("libgtk-x11-2.0")] private static extern void gtk_entry_set_icon_from_stock(IntPtr gtk_entry, EntryIconPosition icon_pos, string icon_name); [DllImport("libgtk-x11-2.0")] private static extern void gtk_entry_set_icon_from_pixbuf(IntPtr gtk_entry, EntryIconPosition icon_pos, IntPtr pixbuf); [DllImport("libgtk-x11-2.0")] private static extern void gtk_entry_set_icon_activatable(IntPtr gtk_entry, EntryIconPosition icon_pos, bool activatable); // only used to check for GTK 2.16 icon support [DllImport("libgtk-x11-2.0")] private static extern int gtk_entry_get_icon_at_pos(IntPtr gtk_entry, int x, int y); } public class IconPressReleaseEventArgs : SignalArgs { public EntryIconPosition IconPos { get { return (EntryIconPosition)(int)base.Args[0]; } } } public delegate void IconPressReleaseEventHandler(System.Object o, IconPressReleaseEventArgs args); public enum EntryIconPosition : int { Primary = 0, Secondary = 1 } } Basenji/src/Gui/Widgets/VolumeView.cs0000664000175000017500000001776112067326706017706 0ustar patrickpatrick// VolumeView.cs // // Copyright (C) 2008 - 2010 Patrick Ulbrich // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // using System; using Gtk; using Basenji.Gui.Base; using Basenji.Gui.Widgets.Editors; using Basenji.Icons; using VolumeDB; namespace Basenji.Gui.Widgets { public enum VolumeSortProperty { VolumeID = 1, ArchiveNo = 2, Added = 3, Title = 4, DriveType = 5, Category = 6, /* Description = 7, Keywords = 8 */ } public class VolumeView : ViewBase { private static readonly string STR_UNNAMED = S._("Unnamed"); private static readonly string STR_CATEGORY = S._("Category:"); private static readonly string STR_FILES = S._("files"); private static readonly string STR_TRACKS = S._("tracks"); private const IconSize ICON_SIZE = IconSize.Dialog; private IconCache iconCache; private VolumeSortProperty sortProperty; private bool toggleColumn; public VolumeView() { iconCache = new IconCache(this); sortProperty = VolumeSortProperty.VolumeID; toggleColumn = false; // // init columns // TreeViewColumn col; col = new TreeViewColumn(string.Empty, new CellRendererPixbuf(), "pixbuf", 0); col.Expand = false; AppendColumn(col); col = new TreeViewColumn(string.Empty, new CellRendererText(), "markup", 1); col.Expand = true; AppendColumn(col); // // setup store // ListStore store = new Gtk.ListStore(typeof(Gdk.Pixbuf), typeof(string), /* Volume - not visible */ typeof(Volume)); // must be assignet before // assinging the sort func this.Model = store; Gtk.TreeIterCompareFunc sortfunc = delegate(TreeModel m, TreeIter a, TreeIter b) { Volume vol_a = GetVolume(a); Volume vol_b = GetVolume(b); if (vol_a == null || vol_b == null) return 0; switch (sortProperty) { case VolumeSortProperty.Added: return Math.Sign(vol_a.Added.Subtract(vol_b.Added).Ticks); case VolumeSortProperty.ArchiveNo: return Sorting.NatCompare(vol_a.ArchiveNo, vol_b.ArchiveNo); case VolumeSortProperty.Category: return string.Compare(vol_a.Category, vol_b.Category); case VolumeSortProperty.DriveType: return Math.Sign(vol_a.DriveType - vol_b.DriveType); case VolumeSortProperty.Title: return string.Compare(vol_a.Title, vol_b.Title); case VolumeSortProperty.VolumeID: return Math.Sign(vol_a.VolumeID - vol_b.VolumeID); default: throw new ArgumentException("Invalid VolumeSortProperty"); } return 0; }; store.SetSortFunc(0, sortfunc); store.SetSortFunc(1, sortfunc); // set initial sorting /* Sort(sortProperty, true); */ } public void Fill(Volume[] volumes) { if (volumes == null) throw new ArgumentNullException("volumes"); Clear(); ListStore store = (ListStore)Model; foreach (Volume v in volumes) AddVolume(store, v); // cluumns may still have the old width after clear() // so reset it ColumnsAutosize(); } public void SetSortProperty(VolumeSortProperty sortProperty, bool descending) { this.sortProperty = sortProperty; toggleColumn = !toggleColumn; ((ListStore)Model).SetSortColumnId(toggleColumn ? 0 : 1, descending ? SortType.Descending : SortType.Ascending); } public void Clear() { if (Model != null) { ListStore store = (ListStore)Model; store.Clear(); } } public Volume GetVolume(TreeIter iter) { Volume v = (Model.GetValue(iter, 2) as Volume); return v; } public void RemoveVolume(TreeIter iter) { Remove(iter); } public void UpdateVolume(TreeIter iter, Volume volume) { //Model.SetValue(iter, 0, GetVolumeIcon(volume); Model.SetValue(iter, 1, GetVolumeDescription(volume)); } public void AddVolume(Volume v) { AddVolume((ListStore)this.Model, v); } private void AddVolume(ListStore store, Volume v) { store.AppendValues(GetVolumeIcon(v), GetVolumeDescription(v), v); } private string GetVolumeDescription(Volume v) { // common volume info string title; string category; if (string.IsNullOrEmpty(v.Title)) { Gdk.Color a = Parent.Style.Base(Gtk.StateType.Normal); Gdk.Color b = Parent.Style.Text(Gtk.StateType.Normal); Gdk.Color c = Util.ColorBlend(a, b); double gdk_max = (double)ushort.MaxValue; string col = string.Format("#{0:X2}{1:X2}{2:X2}", (int)(255 * (c.Red / gdk_max)), (int)(255 * (c.Green / gdk_max)), (int)(255 * (c.Blue / gdk_max))); title = string.Format("{1}", col, Util.Escape(STR_UNNAMED)); } else if (!string.IsNullOrEmpty(v.LoanedTo)) { title = string.Format("{0}", Util.Escape(v.Title)); } else { title = Util.Escape(v.Title); } if (string.IsNullOrEmpty(v.ArchiveNo)) { title = string.Format("{0}", title); } else { title = string.Format("{0} ({1})", title, Util.Escape(v.ArchiveNo)); } if (string.IsNullOrEmpty(v.Category)) category = "-"; else if (!VolumeEditor.categories.TryGetTranslatedString(v.Category, out category)) category = v.Category; // specific volume info // only show important info, otherwise its too cluttered, too high! string strFormat = "{0}\n{1} {2}\n{3} / {4} {5}"; string desc; switch (v.GetVolumeType()) { case VolumeType.FileSystemVolume: FileSystemVolume fsv = (FileSystemVolume)v; desc = string.Format(strFormat, title, Util.Escape(STR_CATEGORY), Util.Escape(category), Util.GetSizeStr(fsv.Size), fsv.Files.ToString(), Util.Escape(STR_FILES)); break; case VolumeType.AudioCdVolume: AudioCdVolume avol = (AudioCdVolume)v; desc = string.Format(strFormat, title, Util.Escape(STR_CATEGORY), Util.Escape(category), avol.Duration, avol.Tracks.ToString(), Util.Escape(STR_TRACKS)); break; default: throw new NotImplementedException("Description not implemented for this VolumeType"); } return desc; } private Gdk.Pixbuf GetVolumeIcon(Volume v) { Gdk.Pixbuf icon; switch (v.DriveType) { case VolumeDriveType.CDRom: icon = iconCache.GetIcon(Icons.Icon.Stock_Cdrom, ICON_SIZE); break; case VolumeDriveType.Harddisk: icon = iconCache.GetIcon(Icons.Icon.Stock_Harddisk, ICON_SIZE); break; case VolumeDriveType.Ram: icon = iconCache.GetIcon(Icons.Icon.Stock_Harddisk, ICON_SIZE); // FIXME : is there a more suitable icon? break; case VolumeDriveType.Network: icon = iconCache.GetIcon(Icons.Icon.Stock_Network, ICON_SIZE); break; case VolumeDriveType.Removable: icon = iconCache.GetIcon(Icons.Icon.DriveRemovableMedia, ICON_SIZE); break; case VolumeDriveType.Unknown: icon = iconCache.GetIcon(Icons.Icon.Stock_Harddisk, ICON_SIZE); // FIXME : is there a more suitable icon? break; default: throw new Exception("Invalid VolumeDriveType"); } return icon; } } }Basenji/src/Gui/Widgets/ItemPreview.cs0000664000175000017500000000763312067326706020041 0ustar patrickpatrick// ItemPreview.cs // // Copyright (C) 2009, 2010 Patrick Ulbrich // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // using System; using System.IO; using Gdk; using Gtk; using Cairo; using Basenji.Icons; using VolumeDB; namespace Basenji.Gui.Widgets { public class ItemPreview : DrawingArea { // corner radius const double RADIUS = 6; // min len of a pixmap dimension required for rounded corners const int MIN_LEN_FOR_CORNERS = (int)(RADIUS * 6); private const IconSize ICON_SIZE = IconSize.Dialog; private ItemIcons itemIcons; private Pixbuf pb; private bool isIcon; public ItemPreview() { this.RoundedCorners = true; this.EnableGenericIcons = true; this.itemIcons = new ItemIcons(this); this.pb = null; this.isIcon = false; } public void Preview(VolumeItem item, VolumeDatabase db) { if (item == null) throw new ArgumentNullException("item"); if (db == null) throw new ArgumentNullException("db"); // free old pixbuf (but not a _cached_ icon!) if (!isIcon && (this.pb != null)) { this.pb.Dispose(); this.pb = null; } Pixbuf tmp = PathUtil.GetThumb(item, db, 0); if (tmp != null) { this.pb = tmp; this.isIcon = false; } else { if (EnableGenericIcons) this.pb = itemIcons.GetIconForItem(item, ICON_SIZE); else this.pb = null; this.isIcon = true; } QueueDraw(); } public void Clear() { if (!isIcon && (this.pb != null)) { this.pb.Dispose(); this.pb = null; } QueueDraw(); } public bool RoundedCorners { get; set; } public bool EnableGenericIcons { get; set; } public bool IsThumbnailPreview { get {return !this.isIcon; } } protected override bool OnExposeEvent (EventExpose evnt) { if (pb == null) return true; double sf = 1.0; // pixbuf scale factor // if any image dimension > widget area => calc downscale factor if ((pb.Width > evnt.Area.Width) || (pb.Height > evnt.Area.Height)) { double sfWidth = (double)evnt.Area.Width / pb.Width; double sfHeight = (double)evnt.Area.Height / pb.Height; sf = Math.Min(sfWidth, sfHeight); } // adjust selection area size to that of the pixbuf int width = (int)(pb.Width * sf); int height = (int)(pb.Height * sf); // center in the widget area double x = Math.Floor(evnt.Area.X + (evnt.Area.Width / 2.0) - (width / 2.0)); double y = Math.Floor(evnt.Area.Y + (evnt.Area.Height / 2.0) - (height / 2.0)); using (Context cr = Gdk.CairoHelper.Create(evnt.Window)) { cr.MoveTo(x, y); if (RoundedCorners && !isIcon && (width > MIN_LEN_FOR_CORNERS) && (height > MIN_LEN_FOR_CORNERS)) { cr.Arc(x + width - RADIUS, y + RADIUS, RADIUS, Math.PI * 1.5, Math.PI * 2); cr.Arc(x + width - RADIUS, y + height - RADIUS, RADIUS, 0, Math.PI * .5); cr.Arc(x + RADIUS, y + height - RADIUS, RADIUS, Math.PI * .5, Math.PI); cr.Arc(x + RADIUS, y + RADIUS, RADIUS, Math.PI, Math.PI * 1.5); cr.Clip(); cr.NewPath(); } // set pixbuf source downscale if (sf < 1.0) cr.Scale(sf, sf); // set pixbuf source CairoHelper.SetSourcePixbuf(cr, pb, Math.Floor(x / sf), Math.Floor(y / sf)); // paint pixbuf source cr.Paint(); } return base.OnExposeEvent(evnt); } } } Basenji/src/Gui/Widgets/PageNavigationEvents.cs0000664000175000017500000000223512067326706021653 0ustar patrickpatrick// PageNavigationEvents.cs // // Copyright (C) 2009 Patrick Ulbrich // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // using System; namespace Basenji.Gui.Widgets { public delegate void NavigateEventHandler(object o, NavigateEventArgs args); public class NavigateEventArgs : EventArgs { private NavigationDirection direction; public NavigateEventArgs(NavigationDirection direction) : base() { this.direction = direction; } public NavigationDirection Direction { get {return direction; } } } public enum NavigationDirection { Previous, Next } } Basenji/src/Gui/Widgets/Led.cs0000664000175000017500000000270112067326706016274 0ustar patrickpatrick// Led.cs // // Copyright (C) 2008 Patrick Ulbrich // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // using System; using Gtk; using Gdk; namespace Basenji.Gui.Widgets { public class Led : Base.BinBase { private Gtk.Image image; private Gdk.Pixbuf pixbufLedOn; private Gdk.Pixbuf pixbufLedOff; private bool state; // on / off public Led() : this(false) { } public Led(bool initialState) { BuildGui(); this.pixbufLedOn = Pixbuf.LoadFromResource("Basenji.images.LED_On.png"); this.pixbufLedOff = Pixbuf.LoadFromResource("Basenji.images.LED_Off.png"); LedState = initialState; } public bool LedState { get { return state; } set { state = value; image.Pixbuf = state ? pixbufLedOn : pixbufLedOff; } } protected override void BuildGui() { this.image = new Gtk.Image(); this.Add(image); } } } Basenji/src/Gui/Widgets/ItemView.cs0000664000175000017500000002170012067326706017321 0ustar patrickpatrick// ItemView.cs // // Copyright (C) 2008, 2010 Patrick Ulbrich // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // using System; using Gtk; using VolumeDB; using Basenji.Gui.Base; using Basenji.Icons; namespace Basenji.Gui.Widgets { public class ItemView : ViewBase { private readonly string STR_LOADING = S._("Loading..."); private readonly string STR_EMPTY = S._("(empty)"); private const IconSize ICON_SIZE = IconSize.Button; private ItemIcons itemIcons; private Gdk.Pixbuf loadingIcon; private VolumeDatabase database; private VolumeType currentVolumeType; private int item_col; public ItemView() { itemIcons = new ItemIcons(this); loadingIcon = this.RenderIcon(Icons.Icon.Stock_Find, ICON_SIZE); HeadersClickable = true; database = null; currentVolumeType = (VolumeType)(-1); item_col = -1; // event handlers RowExpanded += OnRowExpanded; ButtonPressEvent += OnButtonPressEvent; } public void FillRoot(Volume volume, VolumeDatabase db) { if (volume == null) throw new ArgumentNullException("volume"); if (db == null) throw new ArgumentNullException("db"); this.database = db; TreeModel model; VolumeType volType = volume.GetVolumeType(); ResetView(); switch (volType) { case VolumeType.FileSystemVolume: InitView(volType, out model); // load volume root FileSystemVolume fsv = (FileSystemVolume)volume; DirectoryVolumeItem item = fsv.GetRoot(); AppendDirRows((TreeStore)model, TreeIter.Zero, item); Model = model; /*ColumnsAutosize();*/ break; case VolumeType.AudioCdVolume: InitView(volType, out model); // load volume root AudioCdVolume avol = (AudioCdVolume)volume; AudioCdRootVolumeItem root = avol.GetRoot(); AudioTrackVolumeItem[] tracks = root.GetTracks(); ListStore store = (ListStore)model; if (tracks.Length == 0) { store.AppendValues(null, STR_EMPTY, STR_EMPTY, STR_EMPTY); } else { foreach (AudioTrackVolumeItem track in tracks) { store.AppendValues(GetImage(track), track.Name, (track.Artist.Length == 0 ? S._("Unknown") : track.Artist), string.Format("{0:D2}:{1:D2}", track.Duration.Minutes, track.Duration.Seconds), track); } } Model = model; /*ColumnsAutosize();*/ break; default: throw new NotImplementedException("Items view has not been implemented for this volumetype"); } } public void Clear() { if (Model != null) { if (Model is TreeStore) ((TreeStore)Model).Clear(); else ((ListStore)Model).Clear(); } } public VolumeType CurrentVolumeType { get { return currentVolumeType; } } public VolumeItem GetItem(TreeIter iter) { if (item_col < 0) return null; VolumeItem item = (VolumeItem)Model.GetValue(iter, item_col); return item; } private void InitView(VolumeType volType, out TreeModel model) { currentVolumeType = volType; TreeViewColumn col; switch (volType) { case VolumeType.FileSystemVolume: HeadersVisible = false; CellRendererPixbuf pix = new CellRendererPixbuf(); CellRendererText txt = new CellRendererText(); col = new TreeViewColumn(); col.PackStart(pix, false); col.PackStart(txt, false); col.SetAttributes(pix, "pixbuf", 0); col.SetAttributes(txt, "text", 1); col.SetCellDataFunc(txt, CellDataFunc); AppendColumn(col); // set up store model = new TreeStore(typeof(Gdk.Pixbuf), typeof(string), /* VolumeItem - not visible */ typeof(FileSystemVolumeItem)); item_col = 2; break; case VolumeType.AudioCdVolume: HeadersVisible = true; col = new TreeViewColumn(string.Empty, new CellRendererPixbuf(), "pixbuf", 0); col.Resizable = false; col.Expand = false; AppendColumn(col); var tmp = new CellRendererText(); col = new TreeViewColumn(S._("Name"), tmp, "text", 1); col.Resizable = true; col.Expand = true; col.SetCellDataFunc(tmp, CellDataFunc); AppendColumn(col); col = new TreeViewColumn(S._("Artist"), new CellRendererText(), "text", 2); col.Resizable = true; col.Expand = true; AppendColumn(col); col = new TreeViewColumn(S._("Duration"), new CellRendererText(), "text", 3); col.Resizable = true; col.Expand = false; AppendColumn(col); // set up store model = new ListStore(typeof(Gdk.Pixbuf), typeof(string), typeof(string), typeof(string), /* VolumeItem - not visible */ typeof(AudioTrackVolumeItem)); item_col = 4; break; default: throw new NotImplementedException("View initialization has not been implemented for this volumetype"); } } private void AppendDirRows(TreeStore store, TreeIter parent, DirectoryVolumeItem item) { bool parentIsRoot = (parent.Stamp == TreeIter.Zero.Stamp); DirectoryVolumeItem[] dirs = item.GetDirectories(); FileVolumeItem[] files = item.GetFiles(); // if no files or dirs have been found, add an empty node if (dirs.Length == 0 && files.Length == 0) { AppendDirValues(store, parent, parentIsRoot, null, STR_EMPTY, null); } else { foreach (DirectoryVolumeItem dir in dirs) { TreeIter iter = AppendDirValues(store, parent, parentIsRoot, GetImage(dir), dir.Name, dir); if (iter.Stamp != TreeIter.Zero.Stamp) AppendDirValues(store, iter, false, loadingIcon, STR_LOADING, null); } foreach (FileVolumeItem file in files) { AppendDirValues(store, parent, parentIsRoot, GetImage(file), file.Name, file); } } } private TreeIter AppendDirValues(TreeStore store, TreeIter parent, bool parentIsRoot, Gdk.Pixbuf icon, string name, VolumeItem item) { if ((item != null) && !App.Settings.ShowHiddenItems && item.Name.StartsWith(".")) return TreeIter.Zero; if (parentIsRoot) return store.AppendValues(icon, name, item); else return store.AppendValues(parent, icon, name, item); } private Gdk.Pixbuf GetImage(VolumeItem item) { Gdk.Pixbuf img = null; if (App.Settings.ShowThumbsInItemLists) { int sz = IconUtils.GetIconSizeVal(ICON_SIZE); img = PathUtil.GetThumb(item, database, sz); } if (img == null) img = itemIcons.GetIconForItem(item, ICON_SIZE); return img; } private void CellDataFunc(TreeViewColumn column, CellRenderer cell, TreeModel model, TreeIter iter) { VolumeItem item = GetItem(iter); Gtk.CellRendererText txt = cell as Gtk.CellRendererText; if ((item != null) && ((item.Note.Length > 0) || (item.Keywords.Length > 0))) { txt.Style = Pango.Style.Italic; //txt.Foreground = "darkgreen"; txt.Text = txt.Text + " *"; } else { txt.Style = Pango.Style.Normal; //txt.Foreground = null; } } private void OnRowExpanded(object o, RowExpandedArgs args) { switch (CurrentVolumeType) { case VolumeType.FileSystemVolume: TreeStore store = (TreeStore)Model; // get child node of expanded node TreeIter child; store.IterChildren(out child, args.Iter); // test if the first child is the "loading" child node if ((GetItem(child) == null) && ((string)Model.GetValue(child, 1) == STR_LOADING)) { // append dir children DirectoryVolumeItem dir = (DirectoryVolumeItem)GetItem(args.Iter); AppendDirRows(store, args.Iter, dir); // remove "loading" child node store.Remove(ref child); } break; default: throw new NotImplementedException("View for this VolumeType has not been implemented yet"); } } [GLib.ConnectBefore()] private void OnButtonPressEvent(object o, ButtonPressEventArgs args) { if (args.Event.Type == Gdk.EventType.TwoButtonPress) { TreeIter iter; if (!GetSelectedIter(out iter)) return; if (Model.IterHasChild(iter)) { TreePath path = Model.GetPath(iter); if (GetRowExpanded(path)) CollapseRow(path); else ExpandRow(path, false); } } } } }Basenji/src/Gui/Widgets/SearchEntry.cs0000664000175000017500000001526412067326706020027 0ustar patrickpatrick/// SearchEntry.cs // // Copyright (C) 2009 - 2012 Patrick Ulbrich // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // using System; using GLib; using Basenji.Icons; namespace Basenji.Gui.Widgets { public class SearchEntryPreset { public string Caption { get; set; } public string Value { get; set; } public string Suggestion { get; set; } public SearchEntryPreset() { Caption = Value = Suggestion = null; } public SearchEntryPreset(string caption, string value, string suggestion) { Caption = caption; Value = value; Suggestion = suggestion; } } public class SearchEntry : IconEntry { private string placeholderText; private SearchEntryPreset[] presets; private bool presetsChanged; private Gtk.Menu popup; public SearchEntry () { this.placeholderText = null; this.presets = null; this.presetsChanged = false; this.popup = null; this.ShowClearIcon = true; this.SetIconFromStock(Icon.Stock_Find.Name, EntryIconPosition.Primary); this.KeyPressEvent += OnKeyPressEvent; this.Changed += OnChanged; this.IconPress += OnIconPressEvent; this.Shown += OnShown; this.FocusInEvent += OnFocusInEvent; this.FocusOutEvent += OnFocusOutEvent; } // TODO: remove the method if gkt supports entry icons // on all platforms public Gtk.Widget GetFallbackWrapper() { if (IconsSupported) return this; // if the entry does not support embedded icons (old gtk version, e.g. on MS Windows), // return a wrapper with the icon left to the entry Gtk.HBox hbox = new Gtk.HBox(false, 3); Gdk.Pixbuf pb = Basenji.Icons.Icon.Stock_Find.Render(this, Gtk.IconSize.Menu); Gtk.Image img = new Gtk.Image(pb); Gtk.Button btn = new Gtk.Button(); btn.Relief = Gtk.ReliefStyle.None; btn.Clicked += delegate { ShowPopup(); }; btn.Image = img; // also disable the button if the Search entry is disabled this.StateChanged += delegate { btn.Sensitive = this.Sensitive; }; hbox.PackStart(btn, false, false, 0); hbox.PackStart(this, true, true, 0); return hbox; } public string PlaceholderText { get { return placeholderText; } set { placeholderText = value; if (Parent != null) { // Only applies if the widget has a parent yet. // if not, OnShown() calls this method anyways. SetPlaceholderText(true); } } } public void SetPresets(SearchEntryPreset[] presets) { this.presets = presets; this.presetsChanged = true; } public bool ShowClearIcon { get; set; } private void ShowPopup() { if ((presets == null) || (presets.Length == 0)) return; EventHandler onActivated = delegate(object sender, EventArgs e) { Gtk.MenuItem item = (Gtk.MenuItem)sender; SetPlaceholderText(false); if (Text.Length > 0) { if ((!Text.TrimEnd().EndsWith(" or")) && (!Text.TrimEnd().EndsWith(" OR")) && (!Text.TrimEnd().EndsWith(" and")) && (!Text.TrimEnd().EndsWith(" AND"))) { if (!Text.EndsWith(" ")) Text += " "; Text += "and "; } else { if (!Text.EndsWith(" ")) Text += " "; } } var p = (SearchEntryPreset)item.Data["preset"]; if (!string.IsNullOrEmpty(p.Value)) { Text += p.Value; if (!string.IsNullOrEmpty(p.Suggestion)) { Text += " " + p.Suggestion; GrabFocus(); SelectRegion(Text.Length - p.Suggestion.Length, Text.Length); } else { GrabFocus(); SelectRegion(Text.Length, Text.Length); } } }; if (presetsChanged) { if (popup != null) popup.Dispose(); popup = new Gtk.Menu(); foreach (var p in presets) { Gtk.MenuItem item = new Gtk.MenuItem(p.Caption); item.Activated += onActivated; item.Data["preset"] = p; popup.Append(item); } popup.ShowAll(); presetsChanged = false; } popup.Popup(); } protected virtual void OnSearch() { if (Search != null) Search(this, new SearchEventArgs(Text)); } public event SearchEventHandler Search; private void SetPlaceholderText(bool set) { Gdk.Color a = Parent.Style.Base(Gtk.StateType.Normal); Gdk.Color b = Parent.Style.Text(Gtk.StateType.Normal); if (set) { if ((Text.Length == 0) && !string.IsNullOrEmpty(placeholderText)) { ModifyText(Gtk.StateType.Normal, Util.ColorBlend(a, b)); Text = placeholderText; } } else { ModifyText(Gtk.StateType.Normal, b); if (IsPlaceholderTextActive()) Text = string.Empty; } } private bool IsPlaceholderTextActive() { return (Text.Length > 0) && (Text == placeholderText); } [GLib.ConnectBefore()] private void OnKeyPressEvent(object o, Gtk.KeyPressEventArgs args) { if (args.Event.Key != Gdk.Key.Return) return; // update search results OnSearch(); } private void OnIconPressEvent(object o, IconPressReleaseEventArgs args) { if (args.IconPos == EntryIconPosition.Primary) { ShowPopup(); } else { // clear-button pressed Text = String.Empty; // update search results OnSearch(); } } private void OnChanged(object o, EventArgs args) { if (ShowClearIcon && ((Text.Length > 0) && !IsPlaceholderTextActive())) SetIconFromStock(Icon.Stock_Clear.Name, EntryIconPosition.Secondary); else SetIconFromStock(null, EntryIconPosition.Secondary); } private void OnShown(object o, EventArgs e) { SetPlaceholderText(true); } void OnFocusInEvent (object o, Gtk.FocusInEventArgs args) { SetPlaceholderText(false); } void OnFocusOutEvent (object o, Gtk.FocusOutEventArgs args) { SetPlaceholderText(true); } } public delegate void SearchEventHandler(object o, SearchEventArgs args); public class SearchEventArgs : EventArgs { private string searchString; public SearchEventArgs(string searchString) : base() { this.searchString = searchString; } public string SearchString { get {return searchString; } } } } Basenji/src/Gui/Widgets/Sorting.cs0000664000175000017500000001727512067326706017231 0ustar patrickpatrick// Copyright (c) 2009 Yves Goergen, // released in the PUBLIC DOMAIN. // http://beta.unclassified.de/code/dotnet/naturalsort/ // Character comparison modes: (choose exactly one!) #define NATSORT_CMP_STRING_NOCASE //#define NATSORT_CMP_STRING //#define NATSORT_CMP_CHAR_NOCASE //#define NATSORT_CMP_CHAR // Additional features: #define NATSORT_WITH_SPECIAL #define NATSORT_WITH_NEGATIVE using System; namespace Basenji.Gui.Widgets { internal static class Sorting { /// /// Compares 2 strings in natural order. /// /// /// /// Comparison result. 0: both strings are equal, negative: s1 < s2, positive: s1 > s2 public static int NatCompare(string s1, string s2) { // Implementation notes: // * Sorting support: // This function can sort strings with numbers in the order of their numeric value, // not just each character's value in their strict order. Negative numbers are // supported only at the beginning of each string. Leading zeros and special // characters are ignored for sorting but are given a preference if both strings // would be equal otherwise (to produce deterministic results). // * Safe use of indices: // Only access a character at a string position, when it is clear that the index is // within the allowed range. // * Produce deterministic results: // Whenever the order of processing s1 and s2 is not irrelevant, i.e. exchanging them, // the resulting sort order may not be deterministic and depend on the order of the // unsorted data. // Special cases if (s1 == s2) return 0; //if (s1 == null && s2 == null) return 0; // Now covered by the line before if (s1 == null) return -1; if (s2 == null) return 1; int pos1 = 0, pos2 = 0; // Current string positions char c1, c2; // Characters at current string positions int len1 = s1.Length; int len2 = s2.Length; // More special cases if (len1 == 0 && len2 == 0) return 0; if (len1 == 0) return -1; if (len2 == 0) return 1; // Negative number flags #if NATSORT_WITH_NEGATIVE bool neg1 = len1 > 1 && s1[0] == '-' && Char.IsDigit(s1[1]); bool neg2 = len2 > 1 && s2[0] == '-' && Char.IsDigit(s2[1]); #else bool neg1 = false, neg2 = false; #endif int preference = 0; // String preference value: -1 prefers s1, 1 prefers s2 (see function return value) bool digit1, digit2; int endnum1, endnum2; // Where the numbers end in the string int numpos1, numpos2; // Current comparison position in a number int lz1, lz2; // Number of leading zeros we've seen until then #if NATSORT_WITH_SPECIAL // These characters will be skipped in comparison const string special = " '\""; #endif // Main loop: do { #if NATSORT_WITH_SPECIAL // Check for non-letter characters and skip them int skipped1 = 0; int skipped2 = 0; while (special.IndexOf(s1[pos1 + skipped1]) != -1 && pos1 + skipped1 < len1 - 1) { skipped1++; } while (special.IndexOf(s2[pos2 + skipped2]) != -1 && pos2 + skipped2 < len2 - 1) { skipped2++; } if (preference == 0) preference = skipped1 - skipped2; if (preference == 0 && skipped1 == skipped2) { // Skipped none or equal number of special characters: compare them for a preference for (int i = 0; i < skipped1; i++) { int c = s1[pos1 + i].CompareTo(s2[pos2 + i]); if (c != 0) { preference = c; break; } } } pos1 += skipped1; pos2 += skipped2; #endif c1 = s1[pos1]; c2 = s2[pos2]; // Check if we have digits in both strings; also accept '-' at the beginning digit1 = Char.IsDigit(c1) || (pos1 == 0 && neg1); digit2 = Char.IsDigit(c2) || (pos2 == 0 && neg2); if (!digit1 || !digit2) { // At least one of them is no digit: compare by character // If one of them is a negative number, replace the '-' by a digit to keep negative // and positive numbers together, not separated by other symbols if (pos1 == 0 && neg1) c1 = '0'; // c1 was '-' if (pos2 == 0 && neg2) c2 = '0'; // c2 was '-' #if NATSORT_CMP_STRING_NOCASE int cmp = string.Compare(c1.ToString(), c2.ToString(), StringComparison.CurrentCultureIgnoreCase); #elif NATSORT_CMP_STRING int cmp = string.Compare(c1.ToString(), c2.ToString(), StringComparison.CurrentCulture); #elif NATSORT_CMP_CHAR_NOCASE int cmp = char.ToLower(c1).CompareTo(char.ToLower(c2)); #elif NATSORT_CMP_CHAR int cmp = c1.CompareTo(c2); #endif if (cmp != 0) return cmp; // We have a string difference at this point #if NATSORT_CMP_STRING_NOCASE || NATSORT_CMP_STRING // Both characters are the same, compare them by value again, to make a preference if (preference == 0 && c1 < c2) preference = -1; if (preference == 0 && c1 > c2) preference = 1; #endif } else { // Both characters are digits: find the whole number value endnum1 = pos1 + 1; while (endnum1 < len1 && Char.IsDigit(s1[endnum1])) endnum1++; endnum1--; endnum2 = pos2 + 1; while (endnum2 < len2 && Char.IsDigit(s2[endnum2])) endnum2++; endnum2--; // Compare both strings from the end of their number leftwards numpos1 = endnum1; numpos2 = endnum2; lz1 = lz2 = 0; #if NATSORT_WITH_NEGATIVE int negfactor = (pos1 == 0 && (neg1 || neg2)) ? -1 : 1; // This implies (pos2 == 0) // Negative number factor, only valid at the beginning of the strings #endif int numcmp = 0; do { c1 = numpos1 >= 0 ? s1[numpos1] : '0'; c2 = numpos2 >= 0 ? s2[numpos2] : '0'; // See if we're still in the number if (numpos1 < pos1 || c1 == '-') { // We left the number in s1: assume '0' c1 = '0'; } if (numpos2 < pos2 || c2 == '-') { // We left the number in s2: assume '0' c2 = '0'; } int cmp = c1.CompareTo(c2); if (cmp != 0) { numcmp = cmp; // We have a numeric difference at this point, keep it for later #if NATSORT_WITH_NEGATIVE numcmp *= negfactor; #endif } // Add '0' to the number of leading zeros, or reset the counter if (c1 == '0') lz1++; else lz1 = 0; if (c2 == '0') lz2++; else lz2 = 0; // Now both digits are the same, try with the next to the left numpos1--; numpos2--; } while (numpos1 >= pos1 || numpos2 >= pos2); // Loop as long as one of the strings is still in the number #if NATSORT_WITH_NEGATIVE if (negfactor == -1 && neg1 ^ neg2) { // Only one of both numbers is negative: make a decision if (neg1) return -1; return 1; } #endif // Traversed both numbers, did we encounter a numeric difference? if (numcmp != 0) return numcmp; // We're still here, so both numbers have the same value // Is one of them longer? Then prefer that one (if not already prefering something) if (preference == 0 && lz1 > lz2) preference = -1; if (preference == 0 && lz1 < lz2) preference = 1; // Continue character-wise right after the last digit of the number: // Set the current pointer to the last digit position, it's increased later pos1 = endnum1; pos2 = endnum2; } // No decision yet, go to the next character pos1++; pos2++; } while (pos1 < len1 && pos2 < len2); // Out of the main loop: // Which of both strings (if any) would continue? if (pos1 < len1) return 1; // s1 is longer than this if (pos2 < len2) return -1; // s2 is longer than this // Both strings end here: Do we have a preference? If not, they're equal. return preference; } } } Basenji/src/Gui/Widgets/Editors/0000775000175000017500000000000012067326706016652 5ustar patrickpatrickBasenji/src/Gui/Widgets/Editors/FileSystemVolumeEditor.cs0000664000175000017500000000511212067326706023623 0ustar patrickpatrick// FileSystemVolumeEditor.cs // // Copyright (C) 2008 - 2012 Patrick Ulbrich // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // using System; using System.Collections.Generic; using Gtk; using Basenji.Gui.Base; using VolumeDB; using VolumeDB.VolumeScanner; namespace Basenji.Gui.Widgets.Editors { public class FileSystemVolumeEditor : VolumeEditor { private Label lblFiles; private Label lblDirectories; private Label lblTotalSize; public FileSystemVolumeEditor() : base(S._("Filesystem")) {} public override void UpdateInfo(VolumeInfo vi) { if (!(vi is FilesystemVolumeInfo)) throw new ArgumentException(string.Format("must be of type {0}", typeof(FilesystemVolumeInfo)), "vi"); base.UpdateInfo(vi); FilesystemVolumeInfo fsvi = (FilesystemVolumeInfo)vi; UpdateInfoLabels(fsvi.Files, fsvi.Directories, fsvi.Size); } protected override void LoadFromObject(VolumeDB.Volume volume) { if (!(volume is FileSystemVolume)) throw new ArgumentException(string.Format("must be of type {0}", typeof(FileSystemVolume)), "volume"); base.LoadFromObject(volume); FileSystemVolume fsvol = (FileSystemVolume)volume; UpdateInfoLabels(fsvol.Files, fsvol.Directories, fsvol.Size); } protected override void AddInfoLabels(List infoLabels) { base.AddInfoLabels(infoLabels); lblFiles = WindowBase.CreateLabel(); lblDirectories = WindowBase.CreateLabel(); lblTotalSize = WindowBase.CreateLabel(); infoLabels.AddRange( new InfoLabel[] { new InfoLabel(S._("Files:"), lblFiles), new InfoLabel(S._("Directories:"), lblDirectories), new InfoLabel(S._("Total size:"), lblTotalSize) } ); } private void UpdateInfoLabels(long files, long directories, long totalSize) { UpdateLabel(lblFiles, files.ToString()); UpdateLabel(lblDirectories, directories.ToString()); UpdateLabel(lblTotalSize, Util.GetSizeStr(totalSize)); } } } Basenji/src/Gui/Widgets/Editors/ObjectEditorEvents.cs0000664000175000017500000000172312067326706022746 0ustar patrickpatrick// Events.cs // // Copyright (C) 2008, 2010 Patrick Ulbrich // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // using System; using VolumeDB; namespace Basenji.Gui.Widgets.Editors { public class SavedEventArgs : EventArgs { public SavedEventArgs(T savedObject) : base() { SavedObject = savedObject; } public T SavedObject { get; private set; } } } Basenji/src/Gui/Widgets/Editors/ItemEditor.cs0000664000175000017500000000753312067326706021256 0ustar patrickpatrick// ItemEditor.cs // // Copyright (C) 2010, 2012 Patrick Ulbrich // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // using System; using System.Collections.Generic; using Gtk; using Basenji; using Basenji.Gui.Base; using VolumeDB; namespace Basenji.Gui.Widgets.Editors { public abstract partial class ItemEditor : ObjectEditor { private string itemType; private Label lblItemType; private Label lblName; protected ItemEditor(string itemType) : base() { this.itemType = itemType; } public static ItemEditor CreateInstance(VolumeItemType itemType) { switch (itemType) { case VolumeItemType.FileVolumeItem: return new FileItemEditor(); case VolumeItemType.DirectoryVolumeItem: return new DirectoryItemEditor(); case VolumeItemType.AudioTrackVolumeItem: return new AudioTrackItemEditor(); default: throw new NotImplementedException(string.Format("ItemEditor widget for VolumeItemType {0} is not implemented", itemType.ToString())); } } public VolumeItem VolumeItem { get { return Object; } } public string Note { get { return tvNote.Buffer.Text; } set { tvNote.Buffer.Text = value; } } public string Keywords { get { return txtKeywords.Text; } set { txtKeywords.Text = value; } } protected override void ValidateForm() { } protected override void SaveToObject(VolumeDB.VolumeItem item) { // save form item.Note = Note; item.Keywords = Keywords.Trim(); item.UpdateChanges(); } protected override void LoadFromObject(VolumeDB.VolumeItem item) { // // form // Note = item.Note; Keywords = item.Keywords; // // info labels // UpdateLabel(lblItemType, itemType); UpdateLabel(lblName, item.Name); } protected override void AddInfoLabels(List infoLabels) { lblItemType = WindowBase.CreateLabel(); lblName = WindowBase.CreateLabel(); lblName.Ellipsize = Pango.EllipsizeMode.End; infoLabels.AddRange( new InfoLabel[] { new InfoLabel(S._("Item type") + ":", lblItemType), new InfoLabel(S._("Name") + ":", lblName), } ); } } // gui initialization public abstract partial class ItemEditor : ObjectEditor { private TextView tvNote; private Entry txtKeywords; protected override void CreateWidgetTbl(out Table tbl) { tbl = WindowBase.CreateTable(2, 2); // labels WindowBase.TblAttach(tbl, WindowBase.CreateLabel(S._("Note") + ":", false, 0F, 0F), 0, 0); WindowBase.TblAttach(tbl, WindowBase.CreateLabel(S._("Keywords") + ":"), 0, 1); // widgets ScrolledWindow swNote = WindowBase.CreateScrolledTextView(out tvNote, VolumeItem.MAX_NOTE_LENGTH); // set min width of the scrolled window widget // (translated labels may make it smaller otherwise) swNote.WidthRequest = 280; txtKeywords = new Entry(VolumeItem.MAX_KEYWORDS_LENGTH); AttachOptions xAttachOpts = AttachOptions.Expand | AttachOptions.Fill | AttachOptions.Shrink; WindowBase.TblAttach(tbl, swNote, 1, 0, xAttachOpts, AttachOptions.Fill | AttachOptions.Expand); WindowBase.TblAttach(tbl, txtKeywords, 1, 1, xAttachOpts, AttachOptions.Fill); // events tvNote.Buffer.Changed += ChangedEventHandler; txtKeywords.Changed += ChangedEventHandler; } } } Basenji/src/Gui/Widgets/Editors/AudioTrackItemEditor.cs0000664000175000017500000000353112067326706023217 0ustar patrickpatrick// AudioTrackItemEditor.cs // // Copyright (C) 2010, 2012 Patrick Ulbrich // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // using System; using System.Collections.Generic; using Gtk; using Basenji.Gui.Base; using VolumeDB; namespace Basenji.Gui.Widgets.Editors { public class AudioTrackItemEditor : ItemEditor { private Label lblDuration; private Label lblMimeType; public AudioTrackItemEditor() : base(S._("Audio CD track")) {} protected override void LoadFromObject(VolumeDB.VolumeItem item) { if (!(item is AudioTrackVolumeItem)) throw new ArgumentException(string.Format("must be of type {0}", typeof(AudioTrackVolumeItem)), "item"); base.LoadFromObject(item); AudioTrackVolumeItem avi = (AudioTrackVolumeItem)item; UpdateLabel(lblDuration, avi.Duration.ToString()); UpdateLabel(lblMimeType, avi.MimeType); } protected override void AddInfoLabels(List infoLabels) { base.AddInfoLabels(infoLabels); lblDuration = WindowBase.CreateLabel(); lblMimeType = WindowBase.CreateLabel(); infoLabels.AddRange( new InfoLabel[] { new InfoLabel(S._("Duration") + ":", lblDuration), new InfoLabel(S._("Type") + ":", lblMimeType) } ); } } } Basenji/src/Gui/Widgets/Editors/ObjectEditor.cs0000664000175000017500000001042612067326706021561 0ustar patrickpatrick// ObjectEditor.cs // // Copyright (C) 2010, 2012 Patrick Ulbrich // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // using System; using System.Collections.Generic; using Gtk; using Basenji.Gui.Base; using Platform.Common.Diagnostics; namespace Basenji.Gui.Widgets.Editors { public abstract partial class ObjectEditor : BinBase { private List infoLabels; protected ObjectEditor() { this.DataChanged = false; this.Object = default(T); this.infoLabels = new List(); AddInfoLabels(infoLabels); BuildGui(); } public bool DataChanged { get; private set; } protected T Object { get; private set; } public new bool Sensitive { get { // just test the first widget return tblWidgets.Children[0].Sensitive; } set { tblWidgets.Foreach(w => { if (!(w is Label)) w.Sensitive = value; }); } } public void Load(T obj) { LoadFromObject(obj); // may throw a ArgumentException this.Object = obj; // changed flag was set to true since the input fields were loaded // but we will keep track of changes made by the user only. DataChanged = false; } public void Save() { if (this.Object == null) throw new InvalidOperationException("No object loaded"); if (!DataChanged) { if (Global.EnableDebugging) Debug.WriteLine("not saving, nothing changed."); } else { if (Global.EnableDebugging) Debug.WriteLine("saving form."); SaveTo(this.Object); DataChanged = false; } } public void SaveTo(T obj) { // Note : don't check if anything has been changed (DataChanged) // because it's possible that an object has been loaded and is then saved // to another object without modifications. if (obj == null) throw new ArgumentNullException("obj"); ValidateForm(); // may throw a ValidationException SaveToObject(obj); OnSaved(); } protected abstract void LoadFromObject(T obj); protected abstract void SaveToObject(T obj); protected abstract void ValidateForm(); protected abstract void AddInfoLabels(List infoLabels); protected void ChangedEventHandler(object sender, EventArgs args) { DataChanged = true; } public event EventHandler> Saved; protected virtual void OnSaved() { if (Saved != null) Saved(this, new SavedEventArgs(this.Object)); } protected void UpdateLabel(Label label, string text) { label.LabelProp = text; label.TooltipText = text; } protected class InfoLabel { public InfoLabel(string caption, Label label) { this.Caption = caption; this.Label = label; } public string Caption { get; set; } public Label Label { get; set; } } } // gui initialization public abstract partial class ObjectEditor : BinBase { private Table tblWidgets; protected override void BuildGui() { // hbox HBox hbox = new HBox(); hbox.Spacing = 18; CreateWidgetTbl(out tblWidgets); hbox.PackStart(tblWidgets, true, true, 0); hbox.PackStart(new VSeparator(), false, false, 0); hbox.PackStart(CreateInfoTbl(), false, false, 0); this.Add(hbox); } protected abstract void CreateWidgetTbl(out Table tbl); private Table CreateInfoTbl() { Table tbl = WindowBase.CreateTable(infoLabels.Count, 2); for (int i = 0; i < infoLabels.Count; i++) { string caption = string.Format("{0}", Util.Escape(infoLabels[i].Caption)); WindowBase.TblAttach(tbl, WindowBase.CreateLabel(caption, true), 0, i); WindowBase.TblAttach(tbl, infoLabels[i].Label, 1, i); infoLabels[i].Label.LabelProp = "-"; } return tbl; } } } Basenji/src/Gui/Widgets/Editors/DirectoryItemEditor.cs0000664000175000017500000000173012067326706023134 0ustar patrickpatrick// DirectoryItemEditor.cs // // Copyright (C) 2010 Patrick Ulbrich // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // using System; using System.Collections.Generic; using Gtk; using Basenji.Gui.Base; using VolumeDB; namespace Basenji.Gui.Widgets.Editors { public class DirectoryItemEditor : FileSystemItemEditor { public DirectoryItemEditor() : base(S._("Directory")) {} } } Basenji/src/Gui/Widgets/Editors/FileSystemItemEditor.cs0000664000175000017500000000432512067326706023257 0ustar patrickpatrick// FileSystemItemEditor.cs // // Copyright (C) 2010, 2012 Patrick Ulbrich // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // using System; using System.Collections.Generic; using Gtk; using Basenji.Gui.Base; using VolumeDB; namespace Basenji.Gui.Widgets.Editors { public abstract class FileSystemItemEditor : ItemEditor { private Label lblLocation; private Label lblLastWriteTime; private Label lblMimeType; protected FileSystemItemEditor(string itemType) : base(itemType) {} protected override void LoadFromObject(VolumeDB.VolumeItem item) { if (!(item is FileSystemVolumeItem)) throw new ArgumentException(string.Format("must be of type {0}", typeof(FileSystemVolumeItem)), "item"); base.LoadFromObject(item); FileSystemVolumeItem fsvi = (FileSystemVolumeItem)item; UpdateLabel(lblLocation, fsvi.Location); UpdateLabel(lblLastWriteTime, fsvi.LastWriteTime.ToString()); UpdateLabel(lblMimeType, string.IsNullOrEmpty(fsvi.MimeType) ? "-" : fsvi.MimeType); } protected override void AddInfoLabels(List infoLabels) { base.AddInfoLabels(infoLabels); lblLocation = WindowBase.CreateLabel(); lblLocation.Ellipsize = Pango.EllipsizeMode.End; lblLastWriteTime = WindowBase.CreateLabel(); lblMimeType = WindowBase.CreateLabel(); lblMimeType.Ellipsize = Pango.EllipsizeMode.End; infoLabels.AddRange( new InfoLabel[] { new InfoLabel(S._("Location") + ":", lblLocation), new InfoLabel(S._("Last write time") + ":", lblLastWriteTime), new InfoLabel(S._("Filetype") + ":", lblMimeType) } ); } } } Basenji/src/Gui/Widgets/Editors/FileItemEditor.cs0000664000175000017500000000345612067326706022056 0ustar patrickpatrick// FileSystemItemEditor.cs // // Copyright (C) 2010, 2012 Patrick Ulbrich // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // using System; using System.Collections.Generic; using Gtk; using Basenji.Gui.Base; using VolumeDB; namespace Basenji.Gui.Widgets.Editors { public class FileItemEditor : FileSystemItemEditor { private Label lblSize; private Label lblHash; public FileItemEditor() : base(S._("File")) {} protected override void LoadFromObject(VolumeDB.VolumeItem item) { if (!(item is FileVolumeItem)) throw new ArgumentException(string.Format("must be of type {0}", typeof(FileVolumeItem)), "item"); base.LoadFromObject(item); FileVolumeItem fvi = (FileVolumeItem)item; UpdateLabel(lblSize, Util.GetSizeStr(fvi.Size)); UpdateLabel(lblHash, string.IsNullOrEmpty(fvi.Hash) ? "-" : fvi.Hash); } protected override void AddInfoLabels(List infoLabels) { base.AddInfoLabels(infoLabels); lblSize = WindowBase.CreateLabel(); lblHash = WindowBase.CreateLabel(); infoLabels.AddRange( new InfoLabel[] { new InfoLabel(S._("Size") + ":", lblSize), new InfoLabel(S._("Hash") + ":", lblHash) } ); } } } Basenji/src/Gui/Widgets/Editors/AudioCdVolumeEditor.cs0000664000175000017500000000445712067326706023062 0ustar patrickpatrick// AudioCdVolumeEditor.cs // // Copyright (C) 2010, 2012 Patrick Ulbrich // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // using System; using System.Collections.Generic; using Gtk; using Basenji.Gui.Base; using VolumeDB; using VolumeDB.VolumeScanner; namespace Basenji.Gui.Widgets.Editors { public class AudioCdVolumeEditor : VolumeEditor { private Label lblTracks; private Label lblDuration; public AudioCdVolumeEditor() : base(S._("Audio CD")) {} public override void UpdateInfo(VolumeInfo vi) { if (!(vi is AudioCdVolumeInfo)) throw new ArgumentException(string.Format("must be of type {0}", typeof(AudioCdVolumeInfo)), "vi"); base.UpdateInfo(vi); AudioCdVolumeInfo avi = (AudioCdVolumeInfo)vi; UpdateInfoLabels(avi.Tracks, avi.Duration); } protected override void LoadFromObject(VolumeDB.Volume volume) { if (!(volume is AudioCdVolume)) throw new ArgumentException(string.Format("must be of type {0}", typeof(AudioCdVolume)), "volume"); base.LoadFromObject(volume); AudioCdVolume avol = (AudioCdVolume)volume; UpdateInfoLabels(avol.Tracks, avol.Duration); } protected override void AddInfoLabels(List infoLabels) { base.AddInfoLabels(infoLabels); lblTracks = WindowBase.CreateLabel(); lblDuration = WindowBase.CreateLabel(); infoLabels.AddRange( new InfoLabel[] { new InfoLabel(S._("Tracks:"), lblTracks), new InfoLabel(S._("Duration:"), lblDuration), } ); } private void UpdateInfoLabels(int tracks, TimeSpan duration) { UpdateLabel(lblTracks, tracks.ToString()); UpdateLabel(lblDuration, duration.ToString()); } } } Basenji/src/Gui/Widgets/Editors/ObjectEditorExceptions.cs0000664000175000017500000000216212067326706023621 0ustar patrickpatrick// ObjectEditorExceptions.cs // // Copyright (C) 2008, 2010 Patrick Ulbrich // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // using System; namespace Basenji.Gui.Widgets.Editors { public class ValidationException : Exception { public ValidationException(string msg, string widgetName, string expectedFormat) : base(msg) { this.WidgetName = widgetName; this.ExpectedFormat = expectedFormat; } public string WidgetName { get; private set; } public string ExpectedFormat { get; private set; } } } Basenji/src/Gui/Widgets/Editors/VolumeEditor.cs0000664000175000017500000002431112067326706021620 0ustar patrickpatrick// VolumeEditor.cs // // Copyright (C) 2008 - 2012 Patrick Ulbrich // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // using System; using System.Collections.Generic; using Gtk; using Basenji; using Basenji.Gui.Base; using VolumeDB; using VolumeDB.VolumeScanner; using Platform.Common.Globalization; namespace Basenji.Gui.Widgets.Editors { public abstract partial class VolumeEditor : ObjectEditor { private string volumeType; private Label lblVolumeType; private Label lblHashed; private Label lblAdded; private TreeIter customCategory; // TODO : // - place "new" button next to the category combobox, // which will open a dialog to add/edit categories (e.g. add "Roms" category) // - suggest category depending on cd content public static readonly TranslatedStringTable categories = new TranslatedStringTable() { { "Backup", S._("Backup") }, { "Documents", S._("Documents") }, { "Music", S._("Music") }, { "Audiobooks", S._("Audiobooks") }, { "Movies", S._("Movies") }, { "Videos", S._("Videos") }, { "Pictures", S._("Pictures") }, { "Games", S._("Games") }, { "Software", S._("Software") }, { "Misc", S._("Misc") }, { "Other", S._("Other") } }; protected VolumeEditor(string volumeType) : base() { customCategory = TreeIter.Zero; this.volumeType = volumeType; } public static VolumeEditor CreateInstance(VolumeType volType) { switch (volType) { case VolumeType.FileSystemVolume: return new FileSystemVolumeEditor(); case VolumeType.AudioCdVolume: return new AudioCdVolumeEditor(); default: throw new NotImplementedException(string.Format("VolumeEditor widget for VolumeType {0} is not implemented", volType.ToString())); } } public Volume Volume { get { return Object; } } public string ArchiveNo { get { return txtArchiveNo.Text; } set { txtArchiveNo.Text = value; } } public string Category { get { // if cmbCategory.ActiveText is empty, no category has been selected for a new volume // or the form has been loaded with an empty category string if (string.IsNullOrEmpty(cmbCategory.ActiveText)) { return null; } else { string category; if (!categories.TryGetUntranslatedString(cmbCategory.ActiveText, out category)) category = cmbCategory.ActiveText; // set user-specified custom category return category; } } set { // remove user-specied custom category, // that possibly has been appended through this setter previously if (customCategory.Stamp != TreeIter.Zero.Stamp) { ((ListStore)cmbCategory.Model).Remove(ref customCategory); customCategory = TreeIter.Zero; } // unselect category cmbCategory.Active = -1; if (value.Length > 0) { TreeModel model = cmbCategory.Model; TreeIter iter; bool selected = false; // select category for (int i = 0; i < categories.Count; i++) { if ((categories.GetUntranslatedString(i)) == value) { model.IterNthChild(out iter, i); cmbCategory.SetActiveIter(iter); selected = true; break; } } // volume.Category is a user-specified custom category // -> append it to the combobox if(!selected) { cmbCategory.AppendText(value); model.IterNthChild(out customCategory, categories.Count); cmbCategory.SetActiveIter(customCategory); } } } } public string Title { get { return txtTitle.Text; } set { txtTitle.Text = value; } } public string Description { get { return tvDescription.Buffer.Text; } set { tvDescription.Buffer.Text = value; } } public string Keywords { get { return txtKeywords.Text; } set { txtKeywords.Text = value; } } public string LoanedTo { get { return txtLoanedTo.Text; } set { txtLoanedTo.Text = value; } } public DateTime LoanedDate { get { return (dcLoanedDate.IsEmpty || !dcLoanedDate.IsValid) ? DateTime.MinValue : dcLoanedDate.Date; } set { dcLoanedDate.Date = value; } } public DateTime ReturnDate { get { return (dcReturnDate.IsEmpty || !dcReturnDate.IsValid) ? DateTime.MinValue : dcReturnDate.Date; } set { dcReturnDate.Date = value; } } // used by the VolumeScanner window to update the info labels periodically public virtual void UpdateInfo(VolumeInfo vi) { UpdateInfoLabels(vi.IsHashed, vi.Added); } protected override void ValidateForm() { // TODO : add further validation if (!dcLoanedDate.IsEmpty && !dcLoanedDate.IsValid) throw new ValidationException("not a valid date", "Loaned date", dcLoanedDate.DatePattern); if (!dcReturnDate.IsEmpty && !dcReturnDate.IsValid) throw new ValidationException("not a valid date", "Return date", dcReturnDate.DatePattern); } protected override void SaveToObject(VolumeDB.Volume volume) { // save form volume.ArchiveNo = ArchiveNo.Trim(); volume.Category = Category; volume.Title = Title.Trim(); volume.Description = Description; volume.Keywords = Keywords.Trim(); volume.LoanedTo = LoanedTo.Trim(); volume.LoanedDate = LoanedDate; volume.ReturnDate = ReturnDate; volume.UpdateChanges(); } protected override void LoadFromObject(VolumeDB.Volume volume) { // // form // ArchiveNo = volume.ArchiveNo; Category = volume.Category; Title = volume.Title; Description = volume.Description; Keywords = volume.Keywords; LoanedTo = volume.LoanedTo; if (volume.LoanedDate != DateTime.MinValue) dcLoanedDate.Date = volume.LoanedDate; else dcLoanedDate.Clear(); if (volume.ReturnDate != DateTime.MinValue) dcReturnDate.Date = volume.ReturnDate; else dcReturnDate.Clear(); // // info labels // UpdateInfoLabels(volume.IsHashed, volume.Added); } private void UpdateInfoLabels(bool isHashed, DateTime added) { UpdateLabel(lblVolumeType, volumeType); UpdateLabel(lblHashed, isHashed ? S._("Yes") : S._("No")); UpdateLabel(lblAdded, added.ToShortDateString()); } protected override void AddInfoLabels(List infoLabels) { lblVolumeType = WindowBase.CreateLabel(); lblHashed = WindowBase.CreateLabel(); lblAdded = WindowBase.CreateLabel(); infoLabels.AddRange( new InfoLabel[] { new InfoLabel(S._("Volume type:"), lblVolumeType), new InfoLabel(S._("Hashed:"), lblHashed), new InfoLabel(S._("Added:"), lblAdded) } ); } } // gui initialization public abstract partial class VolumeEditor : ObjectEditor { private Entry txtArchiveNo; private ComboBox cmbCategory; private Entry txtTitle; private TextView tvDescription; private Entry txtKeywords; private Entry txtLoanedTo; private Widgets.DateChooser dcLoanedDate; private Widgets.DateChooser dcReturnDate; protected override void CreateWidgetTbl(out Table tbl) { tbl = WindowBase.CreateTable(8, 2); // labels WindowBase.TblAttach(tbl, WindowBase.CreateLabel(S._("Archive No.:")), 0, 0); WindowBase.TblAttach(tbl, WindowBase.CreateLabel(S._("Category:")), 0, 1); WindowBase.TblAttach(tbl, WindowBase.CreateLabel(S._("Title:")), 0, 2); WindowBase.TblAttach(tbl, WindowBase.CreateLabel(S._("Description:"), false, 0F, 0F), 0, 3); WindowBase.TblAttach(tbl, WindowBase.CreateLabel(S._("Keywords:")), 0, 4); WindowBase.TblAttach(tbl, WindowBase.CreateLabel(S._("Loaned to:")), 0, 5); WindowBase.TblAttach(tbl, WindowBase.CreateLabel(S._("Loaned date:")), 0, 6); WindowBase.TblAttach(tbl, WindowBase.CreateLabel(S._("Return date:")), 0, 7); // widgets txtArchiveNo = new Entry(Volume.MAX_ARCHIVE_NO_LENGTH); cmbCategory = ComboBox.NewText(); txtTitle = new Entry(Volume.MAX_TITLE_LENGTH); ScrolledWindow swDescription = WindowBase.CreateScrolledTextView(out tvDescription, Volume.MAX_DESCRIPTION_LENGTH); // set min width of the srolled window widget // (translated labels may make it smaller otherwise) swDescription.WidthRequest = 240; txtKeywords = new Entry(Volume.MAX_KEYWORDS_LENGTH); txtLoanedTo = new Entry(Volume.MAX_LOANED_TO_LENGTH); dcLoanedDate = new Widgets.DateChooser(); dcReturnDate = new Widgets.DateChooser(); AttachOptions xAttachOpts = AttachOptions.Expand | AttachOptions.Fill | AttachOptions.Shrink; AttachOptions yAttachOpts = AttachOptions.Fill; WindowBase.TblAttach(tbl, txtArchiveNo, 1, 0, xAttachOpts, yAttachOpts); WindowBase.TblAttach(tbl, cmbCategory, 1, 1, xAttachOpts, yAttachOpts); WindowBase.TblAttach(tbl, txtTitle, 1, 2, xAttachOpts, yAttachOpts); WindowBase.TblAttach(tbl, swDescription, 1, 3, xAttachOpts, AttachOptions.Expand | AttachOptions.Fill); WindowBase.TblAttach(tbl, txtKeywords, 1, 4, xAttachOpts, yAttachOpts); WindowBase.TblAttach(tbl, txtLoanedTo, 1, 5, xAttachOpts, yAttachOpts); WindowBase.TblAttach(tbl, dcLoanedDate, 1, 6, xAttachOpts, yAttachOpts); WindowBase.TblAttach(tbl, dcReturnDate, 1, 7, xAttachOpts, yAttachOpts); // fill combobox foreach (string translated in categories.TranslatedStrings) cmbCategory.AppendText(translated); // events txtArchiveNo.Changed += ChangedEventHandler; cmbCategory.Changed += ChangedEventHandler; txtTitle.Changed += ChangedEventHandler; tvDescription.Buffer.Changed += ChangedEventHandler; txtKeywords.Changed += ChangedEventHandler; txtLoanedTo.Changed += ChangedEventHandler; dcLoanedDate.Changed += ChangedEventHandler; dcReturnDate.Changed += ChangedEventHandler; } } } Basenji/src/Gui/Widgets/CategoryView.cs0000664000175000017500000001303112067326706020176 0ustar patrickpatrick// CategoryView.cs // // Copyright (C) 2009, 2010 Patrick Ulbrich // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // using System; using System.Collections.Generic; using Gtk; using Basenji.Gui.Base; using Basenji.Icons; using VolumeDB; namespace Basenji.Gui.Widgets { public class CategoryView : ViewBase { private const IconSize ICON_SIZE = IconSize.Button; private readonly Gdk.Pixbuf PIXBUF_ALL_ITEMS; private readonly CategoryInfo[] CATEGORIES; private readonly Dictionary MIME_MAPPING; public enum Category : int { Directories = 0, Text = 1, Documents = 2, Music = 3, Movies = 4, Images = 5, Applications = 6, Archives = 7, Development = 8, AllItems = 9, None = 10 } private VolumeItem[] allItems; public CategoryView() { PIXBUF_ALL_ITEMS = RenderIcon(Icons.Icon.Stock_File, ICON_SIZE); // all categories CATEGORIES = new CategoryInfo[] { _ci(Icons.Icon.Stock_Directory, S._("Directories")), _ci(Icons.Icon.Category_Texts, S._("Text")), _ci(Icons.Icon.Category_Documents, S._("Documents")), _ci(Icons.Icon.Category_Music, S._("Music")), _ci(Icons.Icon.Category_Movies, S._("Movies")), _ci(Icons.Icon.Category_Images , S._("Images")), _ci(Icons.Icon.Category_Applications, S._("Applications")), _ci(Icons.Icon.Category_Archives, S._("Archives")), _ci(Icons.Icon.Category_Development, S._("Development")) }; // mimetype -> category mapping MIME_MAPPING = MimeCategoryMapping .GetMapping(/*directoryCategoryData:*/ CATEGORIES[0], /*textCategoryData:*/ CATEGORIES[1], /*documentCategoryData:*/ CATEGORIES[2], /*musicCategoryData:*/ CATEGORIES[3], /*movieCategoryData:*/ CATEGORIES[4], /*imageCategoryData:*/ CATEGORIES[5], /*applicationCategoryData:*/ CATEGORIES[6], /*archiveCategoryData:*/ CATEGORIES[7], /*textCategoryData:*/ CATEGORIES[8]); allItems = new VolumeItem[0]; // // set up columns // HeadersVisible = true; TreeViewColumn col; // column icon/category CellRendererPixbuf pix = new CellRendererPixbuf(); CellRendererText txt = new CellRendererText(); col = new TreeViewColumn(); col.SortColumnId = 1; col.Resizable = true; col.Title = S._("Category"); col.PackStart(pix, false); col.PackStart(txt, false); col.SetAttributes(pix, "pixbuf", 0); col.SetAttributes(txt, "text", 1); AppendColumn(col); Model = GetNewStore(); } public void Categorize(VolumeItem[] items) { if (items == null) throw new ArgumentNullException("items"); ListStore store = GetNewStore(); TreeIter iter = TreeIter.Zero; this.allItems = items; ClearCategories(); if (items.Length > 0) { // categorize items foreach(VolumeItem item in items) { CategoryInfo ci; if (MIME_MAPPING.TryGetValue(item.MimeType, out ci)) ci.items.Add(item); } // fill listore iter = store.AppendValues( PIXBUF_ALL_ITEMS, string.Format("{0} ({1})", S._("All items"), items.Length), Category.AllItems); for (int i = 0; i < CATEGORIES.Length; i++) { CategoryInfo ci = CATEGORIES[i]; if (ci.items.Count > 0) { store.AppendValues( ci.pixbuf, string.Format("{0} ({1})", ci.caption, ci.items.Count), (Category)i); } } } Model = store; ColumnsAutosize(); // select "all items" if (iter.Stamp != TreeIter.Zero.Stamp) Selection.SelectIter(iter); } public Category GetCategory(TreeIter iter) { return (Category)Model.GetValue(iter, 2); } public VolumeItem[] GetCategoryItems(Category c) { switch(c) { case Category.None: return new VolumeItem[0]; case Category.AllItems: return allItems; default: return CATEGORIES[(int)c].items.ToArray(); } } public void Clear() { this.allItems = new VolumeItem[0]; ClearCategories(); if (Model != null) { ListStore store = (ListStore)Model; store.Clear(); } } private void ClearCategories() { foreach(CategoryInfo ci in CATEGORIES) ci.items.Clear(); } private static ListStore GetNewStore() { return new ListStore(typeof(Gdk.Pixbuf), typeof(string), typeof(Category)); } private CategoryInfo _ci(Icons.Icon icon, string caption) { return new CategoryInfo(RenderIcon(icon, ICON_SIZE), caption); } private class CategoryInfo { public CategoryInfo(Gdk.Pixbuf pb, string caption) { this.items = new List(); this.pixbuf = pb; this.caption = caption; } public List items; public Gdk.Pixbuf pixbuf; public string caption; } } } Basenji/src/Gui/Widgets/SearchResultView.cs0000664000175000017500000001142012067326706021025 0ustar patrickpatrick// SearchResultView.cs // // Copyright (C) 2008 - 2010 Patrick Ulbrich // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // using System; using System.Collections.Generic; using Gtk; using Basenji.Gui.Base; using Basenji.Icons; using VolumeDB; namespace Basenji.Gui.Widgets { public class SearchResultView : ViewBase { private static readonly string STR_UNNAMED = S._("Unnamed"); private static readonly string STR_LOCATION = S._("Location"); private static readonly string STR_VOLUME = S._("Volume"); private static readonly string STR_ARCHIVENO = S._("Archive No."); private static readonly string STR_AUDIOTRACK = S._("Audio CD track"); private const IconSize ICON_SIZE = IconSize.Dialog; private ItemIcons itemIcons; private Dictionary volumeCache; public SearchResultView() { itemIcons = new ItemIcons(this); volumeCache = new Dictionary(); // // setup columns // TreeViewColumn col; col = new TreeViewColumn(string.Empty, new CellRendererPixbuf(), "pixbuf", 0); col.Expand = false; AppendColumn(col); col = new TreeViewColumn(string.Empty, new CellRendererText(), "markup", 1); col.Expand = true; AppendColumn(col); } public void Fill(VolumeItem[] items, VolumeDatabase db, bool clearVolumeCache) { if (clearVolumeCache) volumeCache.Clear(); Fill(items, db); } public void Fill(VolumeItem[] items, VolumeDatabase db) { if (items == null) throw new ArgumentNullException("items"); if (db == null) throw new ArgumentNullException("db"); ListStore store = new Gtk.ListStore( typeof(Gdk.Pixbuf), typeof(string), typeof(VolumeItem)); /* VolumeItem - not visible */ foreach (VolumeItem item in items) { Volume vol; if (!volumeCache.TryGetValue(item.VolumeID, out vol)) { vol = item.GetOwnerVolume(); volumeCache.Add(vol.VolumeID, vol); } string description; string itemName = Util.Escape(item.Name); string volTitle = Util.Escape(vol.Title.Length > 0 ? vol.Title : STR_UNNAMED); string archiveNo = Util.Escape(vol.ArchiveNo.Length > 0 ? vol.ArchiveNo : "-"); switch (item.GetVolumeItemType()) { case VolumeItemType.FileVolumeItem: case VolumeItemType.DirectoryVolumeItem: description = string.Format("{0}\n{1}: {2}\n{3}: {4}, {5}: {6}", itemName, Util.Escape(STR_LOCATION), Util.Escape(((FileSystemVolumeItem)item).Location), Util.Escape(STR_VOLUME), volTitle, Util.Escape(STR_ARCHIVENO), archiveNo); break; case VolumeItemType.AudioTrackVolumeItem: description = string.Format("{0}\n{1}\n{2}: {3}, {4}: {5}", itemName, Util.Escape(STR_AUDIOTRACK), Util.Escape(STR_VOLUME), volTitle, Util.Escape(STR_ARCHIVENO), archiveNo); break; default: throw new NotImplementedException("Search result view has not been implemented for this volumetype"); } store.AppendValues(GetImage(item, db), description, item); } this.Model = store; ColumnsAutosize(); } public void Clear() { if (Model != null) { ListStore store = (ListStore)Model; store.Clear(); } } public VolumeItem GetItem(TreeIter iter) { VolumeItem item = (VolumeItem)Model.GetValue(iter, 2); return item; } private Gdk.Pixbuf GetImage(VolumeItem item, VolumeDatabase db) { Gdk.Pixbuf img = null; if (App.Settings.ShowThumbsInItemLists) { int sz = IconUtils.GetIconSizeVal(ICON_SIZE); img = PathUtil.GetThumb(item, db, sz); } if (img == null) img = itemIcons.GetIconForItem(item, ICON_SIZE); return img; } } }Basenji/src/Gui/Widgets/DateChooser.cs0000664000175000017500000001364612067326706020002 0ustar patrickpatrick// DateChooser.cs // // Copyright (C) 2008, 2010 Patrick Ulbrich // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // using System; using System.Globalization; using Gtk; using Gdk; using Basenji.Gui.Base; namespace Basenji.Gui.Widgets { public class DateChooser : BinBase { private IconEntry entry; private ToggleButton btn; private Gtk.Window win; private Gtk.Calendar cal; private DateTime date; private bool validDate; private string datePattern; public DateChooser(DateTime date) { BuildGui(); this.datePattern = CultureInfo.CurrentCulture.DateTimeFormat.ShortDatePattern; this.date = date; //validDate = true; SetDate(date); } public DateChooser() { BuildGui(); this.datePattern = CultureInfo.CurrentCulture.DateTimeFormat.ShortDatePattern; validDate = false; } public bool IsValid { get { return validDate; } } public bool IsEmpty { get { return (entry.Text.Trim().Length == 0); } } public DateTime Date { get { if (!IsValid) throw new FormatException("The date entered is not valid"); if (IsEmpty) throw new FormatException("The date is empty"); return date; } set { SetDate(value); } } public string DatePattern { get { return datePattern; } set { if (value == null) throw new ArgumentNullException(); if (value.Length == 0) throw new ArgumentException("The string must not be empty"); datePattern = value; } } public void Clear() { entry.Text = string.Empty; } public event EventHandler Changed; protected virtual void OnChanged() { if (Changed != null) Changed(this, new EventArgs()); } protected override void BuildGui() { entry = new IconEntry(); entry.Changed += OnEntryChanged; if (entry.IconsSupported) { Pixbuf pb = Gdk.Pixbuf.LoadFromResource("Basenji.images.calendar.png"); entry.SetIconFromPixbuf(pb, EntryIconPosition.Secondary); entry.IconPress += OnIconPressEvent; this.Add(entry); } else { // no icons inside entries supported -> // add a fallback button to the right of the entry HBox hbox = new HBox(); hbox.Spacing = 2; hbox.PackStart(entry, true, true, 0); btn = new ToggleButton(); btn.Add(new Arrow(ArrowType.Down, ShadowType.None)); hbox.PackStart(btn, false, false, 0); this.Add(hbox); btn.Toggled += OnBtnToggled; } } private void ShowPopup() { win = new Gtk.Window(Gtk.WindowType.Popup); win.Screen = this.Screen; win.WidthRequest = this.Allocation.Width; cal = new Gtk.Calendar(); win.Add(cal); if (validDate) cal.Date = date; // events win.ButtonPressEvent += OnWinButtonPressEvent; cal.DaySelectedDoubleClick += OnCalDaySelectedDoubleClick; cal.KeyPressEvent += OnCalKeyPressEvent; cal.ButtonPressEvent += OnCalButtonPressEvent; int x, y; GetWidgetPos(this, out x, out y); win.Move(x, y + Allocation.Height + 2); win.ShowAll(); win.GrabFocus(); Grab.Add(win); Gdk.GrabStatus grabStatus; grabStatus = Gdk.Pointer.Grab(win.GdkWindow, true, EventMask.ButtonPressMask | EventMask.ButtonReleaseMask | EventMask.PointerMotionMask, null, null, Gtk.Global.CurrentEventTime); if (grabStatus == Gdk.GrabStatus.Success) { grabStatus = Gdk.Keyboard.Grab(win.GdkWindow, true, Gtk.Global.CurrentEventTime); if (grabStatus != Gdk.GrabStatus.Success) { Grab.Remove(win); win.Destroy(); win = null; } } else { Grab.Remove(win); win.Destroy(); win = null; } } private void ClosePopup(bool setDate) { if (win != null) { if (setDate) { //date = cal.Date; SetDate(cal.Date); //validDate = true; } Grab.Remove(win); Gdk.Pointer.Ungrab(Gtk.Global.CurrentEventTime); Gdk.Keyboard.Ungrab(Gtk.Global.CurrentEventTime); win.Destroy(); win = null; } if (btn != null) btn.Active = false; } private static void GetWidgetPos(Gtk.Widget w, out int x, out int y) { w.ParentWindow.GetPosition(out x, out y); w.GdkWindow.GetOrigin(out x, out y); x += w.Allocation.X; y += w.Allocation.Y; } private void SetDate(DateTime d) { entry.Text = d.ToString(datePattern); } private void OnBtnToggled(object o, EventArgs args) { if (btn.Active) ShowPopup(); else ClosePopup(false); } private void OnIconPressEvent(object o, IconPressReleaseEventArgs args) { ShowPopup(); } private void OnEntryChanged(object o, EventArgs args) { validDate = DateTime.TryParseExact(entry.Text, datePattern, null, DateTimeStyles.None, out date); OnChanged(); } private void OnWinButtonPressEvent(object o, ButtonPressEventArgs args) { // caught button press from outside the popup -> close popup ClosePopup(false); } private void OnCalButtonPressEvent(object o, ButtonPressEventArgs args) { // cancel event, so the OnWinButtonPressEvent won't be triggered args.RetVal = true; } private void OnCalDaySelectedDoubleClick(object o, EventArgs args) { ClosePopup(true); } private void OnCalKeyPressEvent(object o, KeyPressEventArgs args) { if (args.Event.Key == Gdk.Key.Return) ClosePopup(true); if (args.Event.Key == Gdk.Key.Escape) ClosePopup(false); } } } Basenji/src/Gui/Widgets/ItemInfo.cs0000664000175000017500000004717412067326706017317 0ustar patrickpatrick// ItemInfo.cs // // Copyright (C) 2008 - 2012 Patrick Ulbrich // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // using System; using System.Collections.Generic; using System.Text; using Gtk; using Cairo; using Basenji.Gui.Base; using VolumeDB; using VolumeDB.Metadata; namespace Basenji.Gui.Widgets { public partial class ItemInfo : BinBase { private const int MAX_PREVIEW_WIDTH = 128; // native thumbnail size /* The previews height is determined by its parent Iteminfo widget automatically, * which should be ~MAX_PREVIEW_WIDTH. * Don't force a height or the iteminfo widget will do crazy * up/down jumps when showing/hiding the preview. private const int MAX_PREVIEW_HEIGHT = 128; // native thumbnail size */ private static readonly string STR_BY = S._("by"); private static readonly string STR_FROM = S._("from"); private bool isMinimized; public ItemInfo() { isMinimized = false; BuildGui(); } public void ShowInfo(VolumeItem item, VolumeDatabase db) { if (item == null) throw new ArgumentNullException("item"); if (db == null) throw new ArgumentNullException("db"); // update item preview itemPreview.Preview(item, db); if (!itemPreview.EnableGenericIcons && !Minimized) { if (itemPreview.IsThumbnailPreview) itemPreview.Show(); else itemPreview.Hide(); } // update item properties FillPropertyBox(item); // HACK : // somehow the cells of the outer hbox // don't match the gradient of this widget // if ShowInfo() is called a second time. outerBox.QueueDraw(); this.Show(); } public void Clear() { itemPreview.Clear(); propertyBox.Clear(); } public bool Minimized { get { return isMinimized; } set { isMinimized = value; if (!itemPreview.EnableGenericIcons) { // do not show hidden generic icon if (itemPreview.IsThumbnailPreview || value) itemPreview.Visible = !value; } else { itemPreview.Visible = !value; } if (propertyBox.Minimized != value) propertyBox.Minimized = value; } } private void FillPropertyBox(VolumeItem item) { ItemProperty[] properties; Dictionary nameProperty; switch (item.GetVolumeItemType()) { case VolumeItemType.FileVolumeItem: case VolumeItemType.DirectoryVolumeItem: ItemProperty.GetFSItemProperties((FileSystemVolumeItem)item, out properties, out nameProperty); break; case VolumeItemType.AudioTrackVolumeItem: ItemProperty.GetAudioCdItemProperties((AudioTrackVolumeItem)item, out properties, out nameProperty); break; default: throw new NotImplementedException("Iteminfo has not been implemented for this itemtype yet"); } propertyBox.SetProperties(properties); string tmp; if (nameProperty.TryGetValue("title", out tmp)) { // title found (e.g. html or doc file) // may be followed optionally by artist and/or album (audio file) StringBuilder sbName = new StringBuilder(); StringBuilder sbTooltip = new StringBuilder(); sbName.AppendFormat("{0}", Util.Escape(tmp)); sbTooltip.Append(tmp); if (nameProperty.TryGetValue("artist", out tmp)) { sbName.AppendFormat(" {0} {1}", STR_BY, Util.Escape(tmp)); sbTooltip.AppendFormat(" {0} {1}", STR_BY, tmp); } if (nameProperty.TryGetValue("album", out tmp)) { sbName.AppendFormat(" {0} {1}", STR_FROM, Util.Escape(tmp)); sbTooltip.AppendFormat(" {0} {1}", STR_FROM, tmp); } propertyBox.SetNameProperty(sbName.ToString(), sbTooltip.ToString()); } else { // name expected if (!nameProperty.TryGetValue("name", out tmp)) throw new ArgumentException("Name expected"); propertyBox.SetNameProperty(string.Format("{0}", Util.Escape(tmp)), tmp); } } #region ItemProperty class // helper class that returns properties sorted by priority private class ItemProperty : IComparable { public string name; public string value; public int priority; private static readonly string[] KEYWORD_SEPARATORS = { "; " }; private ItemProperty(string name, string value, int priority) { this.name = name; this.value = value; this.priority = priority; } public int CompareTo(ItemProperty p) { return (this.priority - p.priority); } public static void GetFSItemProperties(FileSystemVolumeItem item, out ItemProperty[] properties, out Dictionary nameProperty) { List tmp; GetCommonItemProperties(item, out tmp, out nameProperty); tmp.Add(new ItemProperty(S._("Location"), item.Location, 202)); if (item.LastWriteTime.Ticks > 0L) tmp.Add(new ItemProperty(S._("Last write time"), item.LastWriteTime.ToString(), 205)); if (item.IsSymLink) { FileSystemVolumeItem targetItem = item.GetSymLinkTargetItem(); string symlinkTargetPath = null; if (targetItem.Location != "/" && targetItem.Name != "/") symlinkTargetPath = string.Format("{0}/{1}", targetItem.Location, targetItem.Name); else symlinkTargetPath = targetItem.Location + targetItem.Name; tmp.Add(new ItemProperty(S._("Symlink target"), symlinkTargetPath, 203)); } if (item is FileVolumeItem) { FileVolumeItem fvi = (FileVolumeItem)item; string sizeStr = Util.GetSizeStr(fvi.Size); string hash = fvi.Hash; tmp.Add(new ItemProperty(S._("Size"), sizeStr, 204)); if (!string.IsNullOrEmpty(hash)) tmp.Add(new ItemProperty(S._("Hash"), hash, 207)); } if (!string.IsNullOrEmpty(item.MimeType)) tmp.Add(new ItemProperty(S._("Filetype"), item.MimeType, 206)); tmp.Sort(); // sort by priority properties = tmp.ToArray(); } public static void GetAudioCdItemProperties(AudioTrackVolumeItem item, out ItemProperty[] properties, out Dictionary nameProperty) { const int PCM_FACTOR = (44100 * 16 * 2) / 8; List tmp; GetCommonItemProperties(item, out tmp, out nameProperty); tmp.Add(new ItemProperty(S._("Duration"), FormatDuration(item.Duration), 202)); tmp.Add(new ItemProperty(S._("Size"), Util.GetSizeStr((long)(item.Duration.TotalSeconds * PCM_FACTOR)), 203)); tmp.Add(new ItemProperty(S._("Track No."), (item.ItemID - 1).ToString(), 204)); if (!string.IsNullOrEmpty(item.MimeType)) tmp.Add(new ItemProperty(S._("Type"), item.MimeType, 205)); tmp.Sort(); // sort by priority properties = tmp.ToArray(); } private static void GetCommonItemProperties(VolumeItem item, out List properties, out Dictionary nameProperty) { List tmp = new List(); nameProperty = new Dictionary(); // // add metadata properties first (higher priority) // if (!item.MetaData.IsEmpty) { Dictionary metadata = item.MetaData.ToDictionary(); // // cherry-pick interesting properties // string val; /* audio properties*/ if (metadata.TryGetValue(MetadataType.GENRE, out val)) { // NOTE: genre keyword is used in e.g. deb packages as well tmp.Add(new ItemProperty(S._("Genre"), RemoveSimilarIDTags(val), 105)); } if (metadata.TryGetValue(MetadataType.ARTIST, out val)) { //tmp2.Add(new ItemProperty(S._("Artist"), val, 101)); nameProperty.Add("artist", RemoveSimilarIDTags(val)); } if (metadata.TryGetValue(MetadataType.TITLE, out val)) { // NOTE: title keyword is used in e.g. html or doc files as well //tmp2.Add(new ItemProperty(S._("Title"), val, 101)); nameProperty.Add("title", RemoveSimilarIDTags(val)); } if (metadata.TryGetValue(MetadataType.ALBUM, out val)) { //tmp2.Add(new ItemProperty(S._("Album"), val, 103)); nameProperty.Add("album", RemoveSimilarIDTags(val)); } if (metadata.TryGetValue(MetadataType.YEAR, out val)) { tmp.Add(new ItemProperty(S._("Year"), RemoveSimilarIDTags(val), 104)); } if (metadata.TryGetValue(MetadataType.DESCRIPTION, out val)) { // NOTE: description keyword is used in e.g. html files as well tmp.Add(new ItemProperty(S._("Description"), RemoveSimilarIDTags(val), 110)); } /* audio / picture / video properties */ if (metadata.TryGetValue(MetadataType.DURATION, out val)) { tmp.Add(new ItemProperty(S._("Duration"), FormatDuration(MetadataUtils.MetadataDurationToTimespan(val)), 106)); } if (metadata.TryGetValue(MetadataType.SIZE, out val)) { // NOTE: size keyword is used in e.g. deb packages as well (unpacked size in kb) if (item.MimeType.StartsWith("image") || item.MimeType.StartsWith("video")) tmp.Add(new ItemProperty(S._("Dimensions"), val, 107)); } /* other properties*/ if (metadata.TryGetValue(MetadataType.FORMAT, out val)) { tmp.Add(new ItemProperty(S._("Format"), val, 108)); } if (metadata.TryGetValue(MetadataType.AUTHOR, out val)) { tmp.Add(new ItemProperty(S._("Author"), val, 111)); } if (metadata.TryGetValue(MetadataType.COPYRIGHT, out val)) { tmp.Add(new ItemProperty(S._("Copyright"), val, 112)); } if (metadata.TryGetValue(MetadataType.PRODUCER, out val)) { tmp.Add(new ItemProperty(S._("Producer"), val, 115)); } if (metadata.TryGetValue(MetadataType.CREATOR, out val)) { tmp.Add(new ItemProperty(S._("Creator"), val, 114)); } if (metadata.TryGetValue(MetadataType.SOFTWARE, out val)) { tmp.Add(new ItemProperty(S._("Software"), val, 116)); } if (metadata.TryGetValue(MetadataType.LANGUAGE, out val)) { tmp.Add(new ItemProperty(S._("Language"), val, 113)); } if (metadata.TryGetValue(MetadataType.PAGE_COUNT, out val)) { tmp.Add(new ItemProperty(S._("Page count"), val, 109)); } if (metadata.TryGetValue(MetadataType.FILENAME, out val)) { // count files in archives // (filenames were joined by MetadataStore.ToDictionary()) int filecount = 0; int lastIndex = -1; while ((lastIndex = val.IndexOf(';', lastIndex + 1)) != -1) { // only count files, skip directory names if ((val[lastIndex - 1] != '/') && (val[lastIndex - 1] != '\\')) filecount++; } if ((val[val.Length - 1] != '/') && (val[val.Length - 1] != '\\')) filecount++; if (filecount > 0) tmp.Add(new ItemProperty(S._("File count"), filecount.ToString(), 117)); } if (Global.EnableDebugging) { foreach (KeyValuePair pair in metadata) { Platform.Common.Diagnostics.Debug.WriteLine( String.Format("{0}: {1}", pair.Key, pair.Value)); } } } // // add common item properties (low priority, shown only if there's room left) // if (!nameProperty.ContainsKey("title")) { // no title metadata // or artist and/or album metadata only nameProperty.Clear(); // use name instead nameProperty.Add("name", item.Name); } if (item.Note.Length > 0) tmp.Add(new ItemProperty(S._("Note"), item.Note, 301)); if (item.Keywords.Length > 0) tmp.Add(new ItemProperty(S._("Keywords"), item.Keywords, 302)); properties = tmp; } private static string RemoveSimilarIDTags(string separatedTags) { // Dirty hack, tries to remove similar IDv2/IDv3 tag keywords, // i.e. tags that were equal in the IDv2 and the IDv3 header up to a certain length. // (e.g "MP3 Title Number 1" (IDv3 tag) and "MP3 Title Numb" (IDv2 tag) // In this case the shorter one is removed. // Fully equal keywords can not occur, they have been filtered out in the scanning process. // NOTE: This function may fail if the keyword itself contains the separator string ("; "). if (separatedTags.IndexOf(KEYWORD_SEPARATORS[0]) > -1) { string[] tags = separatedTags.Split(KEYWORD_SEPARATORS, StringSplitOptions.None); if (tags.Length == 2) { if (tags[0].StartsWith(tags[1])) return tags[0]; else if (tags[1].StartsWith(tags[0])) return tags[1]; } } return separatedTags; } private static string FormatDuration(TimeSpan duration) { // duration.ToString() also returns ms. return string.Format("{0:D2}:{1:D2}:{2:D2}", duration.Hours, duration.Minutes, duration.Seconds); } } #endregion } // gui initialization public partial class ItemInfo : BinBase { private HBox outerBox; private ItemPreview itemPreview; private PropertyBox propertyBox; protected override void BuildGui() { itemPreview = new ItemPreview(); itemPreview.RoundedCorners = true; itemPreview.EnableGenericIcons = false; /*itemPreview.HeightRequest = MAX_PREVIEW_HEIGHT;*/ itemPreview.WidthRequest = MAX_PREVIEW_WIDTH; // set no_window flag to disable background drawing itemPreview.SetFlag(WidgetFlags.NoWindow); propertyBox = new PropertyBox(this); outerBox = new HBox(false, 12); outerBox.BorderWidth = 6; outerBox.PackStart(itemPreview, false, false, 0); outerBox.PackStart(propertyBox, true, true, 0); // (Gtk.Frame derives from Gtk.Bin which has no window) Frame frame = new Frame(); frame.Add(outerBox); // TODO: // setting the no_window flag on current windows GTK seems to be buggy. // remove no_window flag and use a solid bg color instead of a gradient. // check later if the flag is working. if (Platform.Common.Diagnostics.CurrentPlatform.IsWin32) { Gdk.Color baseColor = Style.Base(StateType.Normal); itemPreview.Flags = itemPreview.Flags ^ (int)WidgetFlags.NoWindow; itemPreview.ModifyBg(StateType.Normal, baseColor); EventBox eb = new EventBox(); eb.ModifyBg(StateType.Normal, baseColor); eb.Add(frame); this.Add(eb); return; } frame.ExposeEvent += OnExposeEvent; this.Add(frame); } [GLib.ConnectBefore()] private void OnExposeEvent (object o, ExposeEventArgs args) { int x = args.Event.Area.X; int y = args.Event.Area.Y; int width = args.Event.Area.Width; int height = args.Event.Area.Height; Gdk.Color startColor = Style.Mid(StateType.Normal); Gdk.Color stopColor = Style.Light(StateType.Normal); double alpha = .7; using (Context cr = Gdk.CairoHelper.Create(args.Event.Window)) { cr.MoveTo (x, y); cr.Rectangle(x, y, width, height); Gradient pat = new LinearGradient(x, y, x, y + height / 1.2); pat.AddColorStop(0, ToCairoColor(startColor, alpha)); pat.AddColorStop(1, ToCairoColor(stopColor, alpha)); cr.Pattern = pat; cr.Fill(); } } private static Cairo.Color ToCairoColor(Gdk.Color c, double alpha) { double gdk_max = (double)ushort.MaxValue; return new Cairo.Color(c.Red / gdk_max, c.Green / gdk_max, c.Blue / gdk_max, alpha); } #region PropertyBox class private class PropertyBox : VBox { private Label lblName; private Arrow btnArrow; private Table[] tbls; private HBox hbox; private Label[] captionLbls; private Label[] valueLbls; private ItemInfo owner; private const int MAX_ITEM_PROPERTIES = 8; // must be a multiple of 2 private const int WIDTH = 2; private const int HEIGHT = MAX_ITEM_PROPERTIES / WIDTH; public PropertyBox(ItemInfo owner) : base(false, 12) { this.owner = owner; this.captionLbls = new Label[MAX_ITEM_PROPERTIES]; this.valueLbls = new Label[MAX_ITEM_PROPERTIES]; this.lblName = WindowBase.CreateLabel(string.Empty, true); this.lblName.Ellipsize = Pango.EllipsizeMode.End; this.tbls = new Table[WIDTH]; this.hbox = new HBox(false, 12); for (int i = 0; i < WIDTH; i++) { this.tbls[i] = WindowBase.CreateTable(HEIGHT, 2, 6); // 2 = caption + value this.hbox.PackStart(tbls[i], true, true, 0); } int tbl = 0, y = 0; for (int i = 0; i < MAX_ITEM_PROPERTIES; i++, y++) { if (i == HEIGHT) { y = 0; tbl++; } // create caption label this.captionLbls[i] = WindowBase.CreateLabel(string.Empty, true); // create value label this.valueLbls[i] = WindowBase.CreateLabel(string.Empty, false); this.valueLbls[i].Ellipsize = Pango.EllipsizeMode.End; // attach caption and value labels to the table WindowBase.TblAttach(tbls[tbl], captionLbls[i], 0, y); this.tbls[tbl].Attach(valueLbls[i], 1, 2, (uint)y, (uint)(y + 1)); } // custom button HBox hb = new HBox(false, 6); this.btnArrow = new Arrow(ArrowType.Down, ShadowType.None); hb.PackStart(btnArrow, false, false, 0); hb.PackStart(lblName, true, true, 0); Button btn = new Button(hb); btn.Clicked += OnBtnClicked; this.PackStart(btn, true, false, 0); this.PackStart(hbox, true, true, 0); } public void SetNameProperty(string name, string tooltip) { lblName.LabelProp = name; lblName.TooltipText = tooltip; } public void SetProperties(ItemProperty[] properties) { int itemCount = (properties.Length < MAX_ITEM_PROPERTIES) ? properties.Length : MAX_ITEM_PROPERTIES; // hide second table when it won't contain labels tbls[1].Visible = (itemCount > HEIGHT); for (int i = 0; i < itemCount; i++) { ItemProperty p = properties[i]; captionLbls[i].LabelProp = string.Format("{0}:", p.name); // remove linebreaks valueLbls[i].LabelProp = p.value.Replace('\n', ' ').Replace('\r', ' '); valueLbls[i].TooltipText = p.value; } // clear remaining labels for (int i = itemCount; i < MAX_ITEM_PROPERTIES; i++) { captionLbls[i].LabelProp = string.Empty; valueLbls[i].LabelProp = string.Empty; valueLbls[i].TooltipText = string.Empty; } } public void Clear() { SetNameProperty(string.Empty, string.Empty); for (int i = 0; i < MAX_ITEM_PROPERTIES; i++) { captionLbls[i].LabelProp = String.Empty; valueLbls[i].LabelProp = valueLbls[i].TooltipText = String.Empty; } } public bool Minimized { get { return !hbox.Visible; } set { if (value) { btnArrow.ArrowType = ArrowType.Right; hbox.Visible = false; } else { btnArrow.ArrowType = ArrowType.Down; hbox.Visible = true; } if (owner.Minimized != value) owner.Minimized = value; } } private void OnBtnClicked(object sender, EventArgs args) { Minimized = !Minimized; } } #endregion } } Basenji/src/Gui/Widgets/PageNavigation.cs0000664000175000017500000001136212067326706020467 0ustar patrickpatrick// PageNavigation.cs // // Copyright (C) 2009 Patrick Ulbrich // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // using System; using Gtk; using Basenji.Gui.Base; namespace Basenji.Gui.Widgets { public partial class PageNavigation : BinBase { private readonly string DEFAULT_EMPTY_CAPTION = S._("No items."); private ItemType[] items; private int currentPage; private int totalPages; private int pageSize; private string emptyCaption; public PageNavigation() { pageSize = 10; emptyCaption = DEFAULT_EMPTY_CAPTION; BuildGui(); Clear(); } public void SetItems(ItemType[] items) { this.items = items; currentPage = 0; totalPages = (int)Math.Ceiling(items.Length / ((float)pageSize)); UpdateCaption(); UpdateButtons(); } public ItemType[] PageItems { get { int start, length; GetRange(out start, out length); ItemType[] arr = new ItemType[length]; Array.Copy(items, start, arr, 0, length); return arr; } } public bool PrevPage() { if (currentPage == 0) return false; currentPage--; UpdateCaption(); UpdateButtons(); OnNavigate(NavigationDirection.Previous); return true; } public bool NextPage() { if (currentPage == (totalPages - 1)) return false; currentPage++; UpdateCaption(); UpdateButtons(); OnNavigate(NavigationDirection.Next); return true; } public int CurrentPage { get { return currentPage; } } public int TotalPages { get { return totalPages; } } public int PageSize { get { return pageSize; } set { if (pageSize < 1) throw new ArgumentException("Pagesize must be greater than 0"); pageSize = value; // reset view if (totalPages > 0) SetItems(items); } } public string EmptyCaption { get { return emptyCaption; } set { emptyCaption = value; UpdateCaption(); } } public void Clear() { items = new ItemType[0]; currentPage = 0; totalPages = 0; UpdateCaption(); UpdateButtons(); } private void UpdateCaption() { if (totalPages > 0) { int start, length; GetRange(out start, out length); lbl.Markup = string.Format( S._("Page {0}/{1} ({2} - {3} of {4} items)"), currentPage + 1, totalPages, start + 1, start + length, items.Length); } else { lbl.Markup = string.IsNullOrEmpty(emptyCaption) ? string.Empty : emptyCaption; } lbl.Sensitive = (totalPages > 0); } private void UpdateButtons() { if (totalPages == 0) { prev.Sensitive = false; next.Sensitive = false; } else { prev.Sensitive = (currentPage > 0); next.Sensitive = (currentPage < (totalPages - 1)); } } private void GetRange(out int start, out int length) { start = currentPage * pageSize; length = pageSize; if ((start + length) > items.Length) length = items.Length - start; } public event NavigateEventHandler Navigate; protected void OnNavigate(NavigationDirection d) { if (Navigate != null) Navigate(this, new NavigateEventArgs(d)); } private void OnBtnPrevClicked(object sender, System.EventArgs args) { PrevPage(); } private void OnBtnNextClicked(object sender, System.EventArgs args) { NextPage(); } } // gui initialization public partial class PageNavigation : BinBase { private Label lbl; private Button prev; private Button next; protected override void BuildGui() { // hbox HBox hbox = new HBox(); hbox.Spacing = 6; lbl = WindowBase.CreateLabel(string.Empty, true, 0.5F, 0.5F); hbox.PackStart(lbl, true, true, 0); prev = WindowBase.CreateCustomButton(Icons.Icon.Stock_GoBack.Render(this, IconSize.Button), null, OnBtnPrevClicked); prev.Relief = ReliefStyle.None; next = WindowBase.CreateCustomButton(Icons.Icon.Stock_GoForward.Render(this, IconSize.Button), null, OnBtnNextClicked); next.Relief = ReliefStyle.None; hbox.PackStart(prev, false, false, 0); hbox.PackStart(next, false, false, 0); this.Add(hbox); } } } Basenji/src/Gui/ObjectProperties.cs0000664000175000017500000000657012067326706017455 0ustar patrickpatrick// ObjectProperties.cs // // Copyright (C) 2008 - 2012 Patrick Ulbrich // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // using System; using Basenji.Gui.Base; using Basenji.Gui.Widgets.Editors; using VolumeDB; using Gtk; namespace Basenji.Gui { public abstract partial class ObjectProperties : WindowBase { private string title; private int width, height; protected ObjectProperties(T obj, string title, ObjectEditor editor, int width, int height) { this.title = title; this.objEditor = editor; if (width > 0) this.width = width; if (height > 0) this.height = height; BuildGui(); objEditor.Load(obj); } private bool SaveAndClose() { try { objEditor.Save(); this.Destroy(); } catch (ValidationException e) { MsgDialog.ShowError(this, S._("Invalid data"), string.Format(S._("\"{0}\" is {1}.\n\nExpected format: {2}\nPlease correct or remove the data you entered.") , e.WidgetName, e.Message, e.ExpectedFormat)); return false; } return true; } public event EventHandler> Saved; protected virtual void OnSaved(T obj) { if (Saved != null) Saved(this, new SavedEventArgs(obj)); } private void OnObjEditorSaved(object o, SavedEventArgs args) { OnSaved(args.SavedObject); } private void OnBtnCloseClicked(object sender, System.EventArgs e) { SaveAndClose(); } private void OnDeleteEvent(object o, Gtk.DeleteEventArgs args) { bool cancel = !SaveAndClose(); args.RetVal = cancel; } [GLib.ConnectBefore()] private void OnWindowKeyPressEvent(object o, Gtk.KeyPressEventArgs args) { if (args.Event.Key == Gdk.Key.Escape) SaveAndClose(); } } // gui initialization public abstract partial class ObjectProperties : WindowBase { private ObjectEditor objEditor; private Button btnClose; protected override void BuildGui () { base.BuildGui(); // general window settings SetModal(); this.DefaultWidth = this.width; this.DefaultHeight = this.height; this.Title = this.title; // vbOuter VBox vbOuter = new VBox(); vbOuter.BorderWidth = 12; vbOuter.Spacing = 18; // objEditor vbOuter.PackStart(objEditor, true, true, 0); // button box HButtonBox bbox = new HButtonBox(); bbox.LayoutStyle = ButtonBoxStyle.End; btnClose = CreateButton(Stock.Close, true, OnBtnCloseClicked); bbox.PackStart(btnClose, false, false, 0); vbOuter.PackStart(bbox, false, false, 0); this.Add(vbOuter); // events objEditor.Saved += OnObjEditorSaved; this.KeyPressEvent += OnWindowKeyPressEvent; this.DeleteEvent += OnDeleteEvent; this.ShowAll(); } } } Basenji/src/Gui/DBProperties.cs0000664000175000017500000000724212067326706016531 0ustar patrickpatrick// DBProperties.cs // // Copyright (C) 2008 - 2012 Patrick Ulbrich // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // using System; using VolumeDB; using Gtk; using Basenji.Gui.Base; namespace Basenji.Gui { public partial class DBProperties : WindowBase { private VolumeDatabase db; private DatabaseProperties props; public DBProperties(VolumeDatabase db) { BuildGui(); this.db = db; props = db.GetDBProperties(); entName.Text = props.Name; tvDescription.Buffer.Text = props.Description; entCreated.Text = props.Created.ToString(); } private void Save() { props.Name = entName.Text; props.Description = tvDescription.Buffer.Text; db.UpdateDBProperties(props); } private void SaveAndClose() { Save(); this.Destroy(); } private void OnBtnCloseClicked(object sender, System.EventArgs e) { SaveAndClose(); } private void OnDeleteEvent(object o, Gtk.DeleteEventArgs args) { SaveAndClose(); } [GLib.ConnectBefore()] private void OnWindowKeyPressEvent(object o, Gtk.KeyPressEventArgs args) { if (args.Event.Key == Gdk.Key.Escape) SaveAndClose(); } } // gui initialization public partial class DBProperties : WindowBase { private Entry entName; private TextView tvDescription; private Entry entCreated; private Button btnClose; protected override void BuildGui() { base.BuildGui(); //general window settings SetModal(); // this.DefaultWidth = 400; this.DefaultHeight = 240; this.Title = S._("Database Properties"); this.Icon = this.RenderIcon(Basenji.Icons.Icon.Stock_Properties, IconSize.Menu); // vbOuter VBox vbOuter = new VBox(); vbOuter.BorderWidth = 12; vbOuter.Spacing = 18; // table Table tbl = CreateTable(3, 2); // labels TblAttach(tbl, CreateLabel(S._("Name:")), 0, 0); TblAttach(tbl, CreateLabel(S._("Description:"), false, 0.0f, 0.0f), 0, 1); TblAttach(tbl, CreateLabel(S._("Created:")), 0, 2); // name entry entName = new Entry(DatabaseProperties.MAX_NAME_LENGTH); TblAttach(tbl, entName, 1, 0); // description textview ScrolledWindow sw = WindowBase.CreateScrolledTextView(out tvDescription, DatabaseProperties.MAX_DESCRIPTION_LENGTH); // set min width of the scrolled windows widget // (translated labels may make it smaller otherwise) sw.WidthRequest = 280; TblAttach(tbl, sw, 1, 1, AttachOptions.Expand | AttachOptions.Fill, AttachOptions.Expand | AttachOptions.Fill); // created entry entCreated = new Entry(); entCreated.Sensitive = false; TblAttach(tbl, entCreated, 1, 2); vbOuter.PackStart(tbl, true, true, 0); // hbuttonbox HButtonBox bbox = new HButtonBox(); //bbox.Spacing = 6; bbox.LayoutStyle = ButtonBoxStyle.End; btnClose = CreateButton(Stock.Close, true, OnBtnCloseClicked); bbox.PackStart(btnClose, false, false, 0); vbOuter.PackStart(bbox, false, false, 0); this.Add(vbOuter); this.KeyPressEvent += OnWindowKeyPressEvent; this.DeleteEvent += OnDeleteEvent; ShowAll(); } } } Basenji/src/Gui/VolumeProperties.cs0000664000175000017500000000204012067326706017502 0ustar patrickpatrick// VolumeProperties.cs // // Copyright (C) 2008, 2010 Patrick Ulbrich // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // using System; using Basenji.Gui.Widgets.Editors; using VolumeDB; namespace Basenji.Gui { public class VolumeProperties: ObjectProperties { public VolumeProperties(Volume volume) : base(volume, S._("Volume Properties"), VolumeEditor.CreateInstance(volume.GetVolumeType()), 0, 400) {} } } Basenji/src/Gui/WaitingDialog.cs0000664000175000017500000000467312067326706016716 0ustar patrickpatrick// WaitingDialog.cs // // Copyright (C) 2012 Patrick Ulbrich // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // using System; using System.Threading; using Gtk; using Gdk; using Basenji.Gui.Base; namespace Basenji.Gui { public delegate bool WaitFunc(out T value); public partial class WaitingDialog : DialogBase { private WaitFunc waitFunc; private string message; private volatile bool canceled; public WaitingDialog (WaitFunc waitFunc, string message) { this.waitFunc = waitFunc; this.Value = default(T); this.message = message; this.canceled = false; BuildGui(); } public new int Run() { BeginWaiting(); return base.Run(); } public T Value { get; private set; } private void BeginWaiting() { System.Action act = delegate { T tmp = default(T); while (!canceled && !waitFunc(out tmp)) Thread.Sleep(1000); if (!canceled) { Application.Invoke(delegate { Value = tmp; Respond(ResponseType.Ok); }); } }; act.BeginInvoke(null, null); } private void OnBtnCancelClicked(object sender, System.EventArgs e) { // terminate waiting thread canceled = true; // return cancel state Respond(ResponseType.Cancel); } } // gui initialization public partial class WaitingDialog : DialogBase { Button btnCancel; protected override void BuildGui() { base.BuildGui(); this.BorderWidth = 0 /* = 2 */; // TODO : somehow the dialog already has a 2 px border.. vbox? bug in gtk#? VBox vb = new VBox(); vb.Spacing = 12; vb.BorderWidth = 12; vb.PackStart(WindowBase.CreateLabel(message, true), true, true, 0); btnCancel = WindowBase.CreateButton(Stock.Cancel, true, OnBtnCancelClicked); vb.PackStart(btnCancel, false, false, 0); VBox.PackStart(vb, true, true, 0); ShowAll(); } } } Basenji/src/Gui/DriveSelection.cs0000664000175000017500000001664012067326706017110 0ustar patrickpatrick// DriveSelection.cs // // Copyright (C) 2008 - 2011 Patrick Ulbrich // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // using System; using System.Threading; using Gtk; using Gdk; using Basenji.Gui.Base; using Platform.Common.IO; using Platform.Common.Diagnostics; namespace Basenji.Gui { public partial class DriveSelection : DialogBase { // specifies whether the root filesystem "/" should be listed or not private const bool EXCLUDE_ROOT_FS = true; private bool isDestroyed; private DriveInfo selectedDrive; public DriveSelection() { BuildGui(); btnOk.Sensitive = false; isDestroyed = false; selectedDrive = null; RefreshListAsync(); } public DriveInfo SelectedDrive { get { return selectedDrive; } } /* * drive refreshing is implemented asynchronously, * because this operation may take a few seconds on windows systems. */ private void RefreshListAsync() { //btnOk.Sensitive = false; if (CurrentPlatform.IsWin32) { ListStore store = new ListStore(typeof(string)); store.AppendValues(S._("Waiting for drives...")); SetColumns(tvDrives, true); tvDrives.Model = store; /*ColumnsAutosize();*/ } new Thread( delegate() { ListStore store = new ListStore(typeof(Pixbuf), typeof(string), typeof(string), typeof(string), /*not visible - driveinfo data*/typeof(object)); DriveInfo[] drives = DriveInfo.GetDrives(true); // list ready drives only TreeIter selectedIter = TreeIter.Zero; foreach (DriveInfo d in drives) { if (EXCLUDE_ROOT_FS && (d.IsMounted && d.RootPath == "/")) continue; //string stockID = Util.GetDriveStockIconID(d); //Pixbuf icon = this.RenderIcon(stockID, IconSize.Dialog, string.Empty); Pixbuf icon = RenderIcon(Icons.IconUtils.GetDriveIcon(d), IconSize.Dialog); string drive = string.IsNullOrEmpty(d.Device) ? S._("Unknown") : d.Device; string label = GetLabel(d); string size = Util.GetSizeStr(d.TotalSize); TreeIter iter = store.AppendValues(icon, drive, label, size, d); // preselect the first cdrom drive found if ((selectedIter.Stamp == TreeIter.Zero.Stamp) && d.DriveType == DriveType.CDRom) selectedIter = iter; } // if no cdrom drive was selected, select first drive if (selectedIter.Stamp == TreeIter.Zero.Stamp) store.GetIterFirst(out selectedIter); if (!isDestroyed) { // only access gui components from the gui thread Application.Invoke(delegate { SetColumns(tvDrives, false); tvDrives.Model = store; /*ColumnsAutosize();*/ // select selectedIter tvDrives.Selection.SelectIter(selectedIter); //btnOk.Sensitive = true; }); } }).Start(); } private static void SetColumns(TreeView tv, bool waiting) { foreach (TreeViewColumn c in tv.Columns) tv.RemoveColumn(c); TreeViewColumn col; CellRendererText leftAlignedTR = new CellRendererText(); leftAlignedTR.Xalign = 0.0f; leftAlignedTR.Ellipsize = Pango.EllipsizeMode.End; if (waiting) { col = new TreeViewColumn(string.Empty, leftAlignedTR, "text", 0); col.Resizable = true; col.Alignment = 0.0f; tv.AppendColumn(col); } else { col = new TreeViewColumn(string.Empty, new CellRendererPixbuf(), "pixbuf", 0); col.Resizable = false; col.Expand = false; tv.AppendColumn(col); col = new TreeViewColumn(S._("Drive"), leftAlignedTR, "text", 1); col.Resizable = true; col.Expand = true; col.Alignment = 0.0f; tv.AppendColumn(col); col = new TreeViewColumn(S._("Label"), leftAlignedTR, "text", 2); col.Resizable = true; col.Expand = true; col.Alignment = 0.0f; tv.AppendColumn(col); CellRendererText rightAlignedTR = new CellRendererText(); rightAlignedTR.Xalign = 1.0f; col = new TreeViewColumn(S._("Size"), rightAlignedTR, "text", 3); col.Resizable = true; col.Expand = false; col.Alignment = 1.0f; tv.AppendColumn(col); } } private bool IsListReady { get { // Columns.Length == 1 : the list has no drive entries (it shows the waiting message) return (tvDrives.Columns.Length > 1); } } private static string GetLabel(DriveInfo d) { string label = d.VolumeLabel; if (label.Length > 0) return label; else if(d.IsMounted && d.RootPath == "/") return S._("Filesystem"); else return "--"; } // private static int GetSelectedIndex(TreeView tv) { // TreePath[] rows = tv.Selection.GetSelectedRows(); // if (rows.Length == 0) // return -1; // // return rows[0].Indices[0]; // } private void OnObjectDestroyed(object o, EventArgs e) { isDestroyed = true; } private void OnTvDrivesSelectionChanged(object o, EventArgs args) { if (!IsListReady) return; TreeModel model; TreeIter iter; if (tvDrives.Selection.GetSelected(out model, out iter)) { // enable ok button on first selection if (selectedDrive == null) btnOk.Sensitive = true; selectedDrive = (DriveInfo)model.GetValue(iter, 4); if (Global.EnableDebugging) { Debug.WriteLine("selected drive '{0}'", selectedDrive.Device); } } } [GLib.ConnectBefore()] private void OnTvDrivesKeyPressEvent(object o, Gtk.KeyPressEventArgs args) { if (IsListReady) { if ((selectedDrive != null) && (args.Event.Key == Gdk.Key.Return)) this.Respond(ResponseType.Ok); } } [GLib.ConnectBefore()] private void OnTvDrivesButtonPressEvent(object o, Gtk.ButtonPressEventArgs args) { if (IsListReady) { TreePath path; tvDrives.GetPathAtPos((int)args.Event.X, (int)args.Event.Y, out path); if (path == null) return; if (args.Event.Type == EventType.TwoButtonPress) this.Respond(ResponseType.Ok); } } } // gui initialization public partial class DriveSelection : DialogBase { private TreeView tvDrives; private Button btnOk; private Button btnCancel; protected override void BuildGui() { base.BuildGui(); //general window settings this.BorderWidth = 0 /* = 2 */; // TODO : somehow the dialog already has a 2 px border.. vbox? bug in gtk#? this.Title = S._("Please select a drive to scan"); //this.DefaultWidth = 320; this.DefaultHeight = 340; // drives treeview ScrolledWindow sw = WindowBase.CreateScrolledView(out tvDrives, false); // set min width of the scrolled window widget sw.WidthRequest = 320; tvDrives.KeyPressEvent += OnTvDrivesKeyPressEvent; tvDrives.ButtonPressEvent += OnTvDrivesButtonPressEvent; tvDrives.Selection.Changed += OnTvDrivesSelectionChanged; this.VBox.PackStart(sw, true, true, 0); // actionarea InitActionArea(out btnOk, out btnCancel, null, null); this.Destroyed += OnObjectDestroyed; ShowAll(); } } } Basenji/src/Gui/About.cs0000664000175000017500000001510512067326706015236 0ustar patrickpatrick// About.cs // // Copyright (C) 2008 Patrick Ulbrich // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // using System; using System.Text; using Gtk; using Gdk; namespace Basenji.Gui { public partial class About : AboutDialog { private static readonly string subTitle = S._("A cross-platform media indexing/search tool."); private static readonly string dbVersion = string.Format(S._("Using VolumeDB v{0}."), Util.GetVolumeDBVersion()); private static readonly string comments = string.Format("{0}\n{1}", subTitle, dbVersion); private static readonly string copyright = string.Format("{0}{1}", S._("Copyright (c) "), App.Copyright); private static readonly string[] authors = new string[] { @"Maintainer: Patrick Ulbrich Contributors: Francesco Marella (https://launchpad.net/~francesco-marella) György Balló (https://launchpad.net/~ballogy) Mauro Solcia (https://launchpad.net/~maurosolcia) Tobias Gruetzmacher (https://launchpad.net/~tobix) " }; private static readonly string translatorCredits = @"Brazilian Portuguese André Gondim (https://launchpad.net/~andregondim) Gilberto Martins (https://launchpad.net/~gsilva-martins) Gustavo Guidorizzi (https://launchpad.net/~gguido) Marcos Oliveira da Cruz (https://launchpad.net/~marcosoliveiradacruz) Matheus de Araújo (https://launchpad.net/~suetamac) Rafael nossal (https://launchpad.net/~rafaelnossal) Ulisses de Castilho Soares (https://launchpad.net/~ulisses-soares) Bulgarian: svilborg (https://launchpad.net/~svilborg) Chinese (Simplified): Li Jin (https://launchpad.net/~lijin) Croatian: Borna Bilas (https://launchpad.net/~borna-bilas) Czech: Konki (https://launchpad.net/~pavel-konkol) Danish: nanker (https://launchpad.net/~nanker) Dutch: Bjorn Robijns (https://launchpad.net/~bjornken) Estonian: olavi tohver (https://launchpad.net/~olts16) French: Anthony Guéchoum (https://launchpad.net/~athael) Aurélien Mino (https://launchpad.net/~murdos) Olivier Duperray (https://launchpad.net/~duperray-olivier) Pierre Slamich (https://launchpad.net/~pierre-slamich) Stephane Ricci (https://launchpad.net/~stephane-ricci) Tubuntu (https://launchpad.net/~t-ubuntu) Y.Bélaïd (https://launchpad.net/~belaid-younsi-gmail) German: Patrick Ulbrich (https://launchpad.net/~pulb) Hebrew: Yaron (https://launchpad.net/~sh-yaron) Hungarian: Polesz (https://launchpad.net/~polesz-nedudu) Roti (https://launchpad.net/~roti-al) Italian: Davide Vidal (https://launchpad.net/~davide-vidal) Fidel Nadera (https://launchpad.net/~welthanschauung) Francesco Marella (https://launchpad.net/~francesco-marella) Giuseppe Caliendo (https://launchpad.net/~giuseppe-caliendo) Guybrush88 (https://launchpad.net/~erpizzo) Martino Barbon (https://launchpad.net/~martins999) meltingshell (https://launchpad.net/~meltingshell) simone.sandri (https://launchpad.net/~lexluxsox) Occitan (post 1500): Cédric Valmary (https://launchpad.net/~cvalmary) Polish: axel (https://launchpad.net/~axel334) Piotr Strębski (https://launchpad.net/~strebski) Stanisław Chmiela (https://launchpad.net/~chmiela-st) Szymon Sieciński (https://launchpad.net/~szymon-siecinski) XeonBloomfield (https://launchpad.net/~xeonbloomfield) Russian: Alexander 'FONTER' Zinin (https://launchpad.net/~spore-09) Alexey Ivanov (https://launchpad.net/~alexey-ivanov) Claque (https://launchpad.net/~cpt-alatriste) Dmitri Konoplev (https://launchpad.net/~knoplef) Eugene Marshal (https://launchpad.net/~lowrider) Nikolai Romanik (https://launchpad.net/~arhey) oleh (https://launchpad.net/~rolenin-c) Oleksiy Zaytsev (https://launchpad.net/~alexiy74) Papazu (https://launchpad.net/~pavel-z) Sciko (https://launchpad.net/~tempsciko-gmail) Sergey Sedov (https://launchpad.net/~serg-sedov) Vladimir (https://launchpad.net/~bonza-land) Serbian: Kosava (https://launchpad.net/~kosava) Мирослав Николић (https://launchpad.net/~lipek) Srdjan Hrnjak (https://launchpad.net/~srdjan-hrnjak) Slovak: Izidor Matušov (https://launchpad.net/~izidor) Spanish: Alfredo Hernández (https://launchpad.net/~aldomann) Daniel Garcia Stelzner (https://launchpad.net/~dani-garcia87) DiegoJ (https://launchpad.net/~diegojromerolopez) Emiliano (https://launchpad.net/~emilianohfernandez) Feder Sáiz (https://launchpad.net/~federsaiz) Fitoschido (https://launchpad.net/~fitoschido) Guillermo Espertino (Gez) (https://launchpad.net/~gespertino-gmail) Luis García (https://launchpad.net/~luismihn) Jonay Santana (https://launchpad.net/~jonay-santana) Jorge Dardón (https://launchpad.net/~jdardon) Julian Lamus (https://launchpad.net/~lamusj) martin (https://launchpad.net/~martu) Martín V. (https://launchpad.net/~martinvukovic) monkey (https://launchpad.net/~monkey-libre) Nicolás M. Zahlut (https://launchpad.net/~nzahlut) Paco Molinero (https://launchpad.net/~franciscomol) Rommel Anatoli Quintanilla Cruz (https://launchpad.net/~romeluko1100) victor tejada yau (https://launchpad.net/~victormtyau) Turkish: Cihan Ersoy (https://launchpad.net/~cihan.ersoy) Ukrainian: Serhey Kusyumoff (https://launchpad.net/~sergemine) Wladimir Rossinski (https://launchpad.net/~wrossin) "; public About() { // general window settings if (Gui.Base.WindowBase.MainWindow != null) this.TransientFor = Gui.Base.WindowBase.MainWindow; this.Modal = true; SkipTaskbarHint = true; Icon = Basenji.Icons.Icon.Stock_About.Render(this, IconSize.Menu); // about dialog settings Logo = new Pixbuf(App.APP_DATA_PATH + "/basenji.svg", 200, 200); ProgramName = App.Name; Version = App.Version; Comments = comments; Copyright = copyright; Website = "http://www.launchpad.net/basenji"; //WebsiteLabel = "Basenji Homepage"; Authors = authors; TranslatorCredits = translatorCredits; } } } Basenji/src/Gui/Events.cs0000664000175000017500000000207312067326706015430 0ustar patrickpatrick// Events.cs // // Copyright (C) 2008 Patrick Ulbrich // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // using System; using VolumeDB; namespace Basenji.Gui { public delegate void NewVolumeAddedEventHandler(object o, NewVolumeAddedEventArgs args); public class NewVolumeAddedEventArgs : EventArgs { private Volume volume; public NewVolumeAddedEventArgs(Volume volume) : base() { this.volume = volume; } public Volume Volume { get {return volume; } } } }Basenji/src/Gui/Base/0000775000175000017500000000000012067326706014505 5ustar patrickpatrickBasenji/src/Gui/Base/DialogBase.cs0000664000175000017500000000504212067326706017027 0ustar patrickpatrick// DialogBase.cs // // Copyright (C) 2008 Patrick Ulbrich // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // using System; using Gtk; namespace Basenji.Gui.Base { public abstract class DialogBase : Gtk.Dialog { public DialogBase() : base() {} protected virtual void BuildGui() { if ((WindowBase.MainWindow != null) && (this != WindowBase.MainWindow)) this.TransientFor = WindowBase.MainWindow; this.BorderWidth = 0; this.WindowPosition = WindowPosition.CenterOnParent; this.Modal = true; this.SkipTaskbarHint = true; this.DestroyWithParent = true; this.HasSeparator = false; this.Icon = App.DefaultWindowIcon; // outer vbox VBox vbOuter = this.VBox; vbOuter.Spacing = 0; } /* protected void ShowAll() { if (this.Child != null) this.Child.ShowAll(); this.Show(); }*/ protected void InitActionArea(out Button btnOk, out Button btnCancel, EventHandler btnOkClicked, EventHandler btnCancelClicked) { // buttonbox HButtonBox bbox = this.ActionArea; bbox.Spacing = 6; // TODO : currently ignored? bug in gtk#? bbox.BorderWidth = 12; // TODO : currently ignored? bug in gtk#? bbox.LayoutStyle = ButtonBoxStyle.End; // cancel button btnCancel = new Button(); btnCancel.CanDefault = true; //btnCancel.CanFocus = true; btnCancel.UseUnderline = true; btnCancel.UseStock = true; btnCancel.Label = Stock.Cancel; if (btnCancelClicked != null) btnCancel.Clicked += btnCancelClicked; this.AddActionWidget(btnCancel, -6); // ok button btnOk = new Button(); btnOk.CanDefault = true; //btnCancel.CanFocus = true; btnOk.UseUnderline = true; btnOk.UseStock = true; btnOk.Label = Stock.Ok; if (btnOkClicked != null) btnOk.Clicked += btnOkClicked; this.AddActionWidget(btnOk, -5); } protected Gdk.Pixbuf RenderIcon(Basenji.Icons.Icon icon, Gtk.IconSize size) { return icon.Render(this, size); } } } Basenji/src/Gui/Base/WindowBase.cs0000664000175000017500000001654012067326706017104 0ustar patrickpatrick// WindowBase.cs // // Copyright (C) 2008 Patrick Ulbrich // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // using System; using Gtk; using Gdk; namespace Basenji.Gui.Base { public abstract class WindowBase : Gtk.Window { public WindowBase() : base(Gtk.WindowType.Toplevel) {} public static Gtk.Window MainWindow { get; set; } protected virtual void BuildGui() { if ((MainWindow != null) && (this != MainWindow)) this.TransientFor = MainWindow; this.BorderWidth = 0; this.WindowPosition = WindowPosition.Center; this.Icon = App.DefaultWindowIcon; } protected void SetModal() { this.Modal = true; /* TODO : somehow disable the minimize button on modal windows when Gtk supports it. */ // this.SkipTaskbarHint = true; } /* protected void ShowAll() { if (this.Child != null) this.Child.ShowAll(); this.Show(); }*/ internal static Gtk.Action CreateAction(string name, string label, string tooltip, string stockid, EventHandler activated) { Gtk.Action a = new Gtk.Action(name, label, tooltip, stockid); if (activated != null) a.Activated += activated; return a; } internal static Gtk.RadioAction CreateRadioAction(string name, string label, string tooltip, string stockid, int value, GLib.SList grp, EventHandler activated) { Gtk.RadioAction a = new Gtk.RadioAction(name, label, tooltip, stockid, value); if (grp != null) a.Group = grp; if (activated != null) a.Activated += activated; return a; } internal static Gtk.ToggleAction CreateToggleAction(string name, string label, string tooltip, string stockid, EventHandler activated) { Gtk.ToggleAction a = new Gtk.ToggleAction(name, label, tooltip, stockid); if (activated != null) a.Activated += activated; return a; } internal static Label CreateLabel() { return CreateLabel(string.Empty); } internal static Label CreateLabel(string caption) { return CreateLabel(caption, false); } internal static Label CreateLabel(string caption, bool useMarkup) { return CreateLabel(caption, useMarkup, 0.0f, 0.5f); } internal static Label CreateLabel(string caption, bool useMarkup, float xalign, float yalign) { Label lbl = new Label(); lbl.UseMarkup = useMarkup; lbl.Xalign = xalign; lbl.Yalign = yalign; lbl.LabelProp = caption; return lbl; } internal static Button CreateButton(string label, bool useStock, EventHandler clicked) { Button btn = new Button(); //btn.CanFocus = true; btn.UseUnderline = true; btn.UseStock = useStock; btn.Label = label; if (clicked != null) btn.Clicked += clicked; return btn; } internal static Button CreateCustomButton(Pixbuf pixbuf, string label, EventHandler clicked) { Button btn = new Button(); btn.UseUnderline = true; if (clicked != null) btn.Clicked += clicked; Alignment algn = new Alignment(0.5f, 0.5f, 0f, 0f); HBox box = new HBox(); box.Spacing = 6; Gtk.Image img = new Gtk.Image(); img.Pixbuf = pixbuf; box.PackStart(img, false, false, 0); if (!string.IsNullOrEmpty(label)) { Label lbl = new Label(); lbl.UseUnderline = true; lbl.LabelProp = label; box.PackStart(lbl, false, false, 0); } algn.Add(box); btn.Add(algn); return btn; } internal static ScrolledWindow CreateScrolledView(out V tv, bool rulesHint) where V : TreeView, new() { // scrolled window ScrolledWindow sw = new ScrolledWindow(); //sw.CanFocus = true; sw.VscrollbarPolicy = Gtk.PolicyType.Automatic; sw.HscrollbarPolicy = Gtk.PolicyType.Automatic; sw.ShadowType = Gtk.ShadowType.In; // treeview tv = new V(); //tv.CanFocus = true; tv.RulesHint = rulesHint; tv.HeadersClickable = true; sw.Add(tv); return sw; } internal static ScrolledWindow CreateScrolledTextView(out TextView txt, int maxChars) { // scrolled window ScrolledWindow sw = new ScrolledWindow(); //sw.CanFocus = true; sw.VscrollbarPolicy = Gtk.PolicyType.Automatic; sw.HscrollbarPolicy = Gtk.PolicyType.Automatic; sw.ShadowType = Gtk.ShadowType.In; // textview txt = new TextView(); //tv.CanFocus = true; if (maxChars > 0) { txt.Buffer.InsertText += delegate(object o, InsertTextArgs e) { // TODO : is there a smarter way to cancel the last typed char? TextBuffer buff = (TextBuffer)o; if (buff.CharCount > maxChars) buff.Text = buff.Text.Substring(0, buff.Text.Length - e.Length); }; } sw.Add(txt); return sw; } // default to 12 pix columnspacing (between label and widget, as proposed in the HIG) internal static Table CreateTable(int rows, int cols) { return CreateTable(rows, cols, 12); } internal static Table CreateTable(int rows, int cols, int colSpacing) { Table tbl = new Table((uint)rows, (uint)cols, false); tbl.RowSpacing = 6; tbl.ColumnSpacing = (uint)colSpacing; return tbl; } internal static void TblAttach(Table tbl, Widget w, int x, int y) { TblAttach(tbl, w, x, y, 1, 1, AttachOptions.Fill, AttachOptions.Fill); } internal static void TblAttach(Table tbl, Widget w, int x, int y, AttachOptions xoptions, AttachOptions yoptions) { TblAttach(tbl, w, x, y, 1, 1, xoptions, yoptions); } internal static void TblAttach(Table tbl, Widget w, int x, int y, int width, int height) { TblAttach(tbl, w, x, y, width, height, AttachOptions.Fill, AttachOptions.Fill); } internal static void TblAttach(Table tbl, Widget w, int x, int y, int width, int height, AttachOptions xoptions, AttachOptions yoptions) { tbl.Attach(w, (uint)x, (uint)(x + width), (uint)y, (uint)(y + height), xoptions, yoptions, (uint)0, (uint)0); } internal static Widget LeftAlign(Widget w) { return LeftAlign(w, 24); } internal static Widget LeftAlign(Widget w, int leftPadding) { Alignment algn = new Alignment(0.5F, 0.5F, 1F, 1F); algn.LeftPadding = (uint)leftPadding; algn.Add(w); return algn; } protected Gdk.Pixbuf RenderIcon(Basenji.Icons.Icon icon, Gtk.IconSize size) { return icon.Render(this, size); } } } Basenji/src/Gui/Base/BinBase.cs0000664000175000017500000000266312067326706016346 0ustar patrickpatrick// BinBase.cs // // Copyright (C) 2008 Patrick Ulbrich // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // using System; using Gtk; namespace Basenji.Gui.Base { public abstract class BinBase : Gtk.Bin { private Widget child; public BinBase() : base() { this.SizeRequested += delegate(object sender, SizeRequestedArgs args) { if (this.child != null) args.Requisition = this.child.SizeRequest(); }; this.SizeAllocated += delegate(object sender, SizeAllocatedArgs args) { if (this.child != null) this.child.Allocation = args.Allocation; }; this.Added += delegate(object sender, AddedArgs args) { this.child = args.Widget; }; } protected abstract void BuildGui(); protected Gdk.Pixbuf RenderIcon(Basenji.Icons.Icon icon, Gtk.IconSize size) { return icon.Render(this, size); } } } Basenji/src/Gui/Base/ViewBase.cs0000664000175000017500000000530712067326706016546 0ustar patrickpatrick// ViewBase.cs // // Copyright (C) 2008 Patrick Ulbrich // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // using System; //using System.Threading; //using System.Runtime.Remoting.Messaging; using Gtk; using VolumeDB; namespace Basenji.Gui.Base { public abstract class ViewBase : TreeView { public ViewBase() { HeadersVisible = false; } // bug (?) workaround: // sometimes, if a new store is assigned to the model, // the vertical scrollposition of a parent scrolledwindow // does not seem to be reset to 0. public new TreeModel Model { get { return base.Model; } set { base.Model = value; if (Vadjustment.Value > 0) Vadjustment.Value = 0; } } // protected abstract void FillingThread(VolumeDatabase database); // // public IAsyncResult BeginFill(VolumeDatabase database, AsyncCallback callback, object state) { // if (database == null) // throw new ArgumentNullException("database"); // // // anonymous fill method executed on a new thread // Util.AsyncMethodInvoker ami = delegate { // FillingThread(database); // }; // // return ami.BeginInvoke(callback, state); // } // // public void EndFill(IAsyncResult asyncResult) { // if (asyncResult == null) // throw new ArgumentNullException("asyncResult"); // // Util.AsyncMethodInvoker d = (Util.AsyncMethodInvoker) ((AsyncResult)asyncResult).AsyncDelegate; // d.EndInvoke(asyncResult); // } public bool GetSelectedIter(out TreeIter iter) { TreeModel model; if (Selection.GetSelected(out model, out iter)) return true; return false; } protected void Remove(TreeIter iter) { // select prev/next row ListStore store = (ListStore)Model; TreePath p = store.GetPath(iter); if (!p.Prev()) p.Next(); Selection.SelectPath(p); // remove selected row store.Remove(ref iter); } protected void ResetView() { foreach (TreeViewColumn c in Columns) RemoveColumn(c); } protected Gdk.Pixbuf RenderIcon(Basenji.Icons.Icon icon, Gtk.IconSize size) { return icon.Render(this, size); } } } Basenji/src/Gui/ItemSearch.cs0000664000175000017500000002772312067326706016221 0ustar patrickpatrick// ItemSearch.cs // // Copyright (C) 2008 - 2012 Patrick Ulbrich // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // using System; using Gtk; using Basenji.Gui.Base; using Basenji.Gui.Widgets; using VolumeDB; using VolumeDB.Searching; using VolumeDB.Searching.ItemSearchCriteria; namespace Basenji.Gui { public partial class ItemSearch : WindowBase { private MainWindow mainWindow; private VolumeDatabase database; private volatile bool windowDeleted; public ItemSearch(MainWindow mainWindow, VolumeDatabase db) { windowDeleted = false; this.mainWindow = mainWindow; this.database = db; BuildGui(); btnSearch.Sensitive = false; txtSearchString.GrabFocus(); // the widget should be visible the first time // when the user clicks on an item itemInfo.Hide(); } private void SetStatus(string message) { statusbar.Pop(1); statusbar.Push(1, message); } private void BeginSearch() { // make sure searching is enabled // (searchstring may be too short) if (!btnSearch.Sensitive) return; ISearchCriteria criteria = null; try { criteria = new EUSLSearchCriteria(txtSearchString.Text); } catch (ArgumentException e) { SetStatus(Util.FormatExceptionMsg(e)); return; } // callback called when searching has been finished AsyncCallback callback = ar => { if (windowDeleted) return; try { VolumeItem[] items = database.EndSearchItem(ar); Application.Invoke((o, args) => { // calls selection changed handler // that fills the searchrestult view tvCategory.Categorize(items); TimeSpan time = DateTime.Now.Subtract((DateTime)ar.AsyncState); SetStatus(string.Format(S._("Found {0} items in {1:F3} seconds."), items.Length, time.TotalSeconds)); }); } catch (Exception e) { Application.Invoke((o, args) => { tvCategory.Clear(); navi.Clear(); tvSearchResult.Clear(); }); if (e is TimeoutException) { // couldn't get connection lock Application.Invoke((o, args) => SetStatus(S._("Timeout: another search is probably still in progress."))); } else if (e is TooManyResultsException) { Application.Invoke((o, args) => SetStatus(S._("Too many search results. Please refine your search criteria."))); } else { //Application.Invoke((o, args) => SetStatus(Util.FormatExceptionMsg(e))); Application.Invoke((o, args) => SetStatus(string.Empty)); throw; } } finally { Application.Invoke((o, args) => { itemInfo.Clear(); itemInfo.Hide(); }); } }; try { infoBar.Visible = false; navi.Visible = true; SetStatus(S._("Searching...")); database.BeginSearchItem(criteria, callback, DateTime.Now); } catch(Exception) { SetStatus(string.Empty); throw; } } private void EditItem() { TreeIter iter = TreeIter.Zero; if (!tvSearchResult.GetSelectedIter(out iter)) return; // load item properties VolumeItem item = tvSearchResult.GetItem(iter); if (item == null) return; new ItemProperties(item); } private void ShowItemInMainWindow() { TreeIter iter = TreeIter.Zero; if (!tvSearchResult.GetSelectedIter(out iter)) return; VolumeItem item = tvSearchResult.GetItem(iter); if (item == null) return; Destroy(); mainWindow.FindItem(item); } private void Close() { App.Settings.ItemInfoMinimized2 = itemInfo.Minimized; windowDeleted = true; this.Destroy(); } private void OnBtnSearchClicked(object o, System.EventArgs args) { BeginSearch(); } private void OnTxtSearchStringSearch(object o, Widgets.SearchEventArgs args) { BeginSearch(); } private void OnTxtSearchStringChanged(object o, EventArgs args) { btnSearch.Sensitive = ( (txtSearchString.Text.Length >= VolumeDatabase.MIN_SEARCHSTR_LENGTH) && (txtSearchString.Text != txtSearchString.PlaceholderText) ); } /* private void OnBtnCloseClicked(object sender, System.EventArgs e) { this.Destroy(); // TODO : not neccessary? }*/ private void OnTvCategorySelectionChanged(object o, EventArgs args) { TreeIter iter; CategoryView.Category c = CategoryView.Category.None; if (tvCategory.GetSelectedIter(out iter)) c = tvCategory.GetCategory(iter); VolumeItem[] categoryItems = tvCategory.GetCategoryItems(c); navi.SetItems(categoryItems); tvSearchResult.Fill(navi.PageItems, database, false); itemInfo.Clear(); itemInfo.Hide(); } private void OnNaviNavigate(object o, NavigateEventArgs args) { tvSearchResult.Fill(navi.PageItems, database, false); itemInfo.Clear(); itemInfo.Hide(); } [GLib.ConnectBefore()] private void OnTvSearchResultButtonPressEvent(object o, ButtonPressEventArgs args) { TreePath path; tvSearchResult.GetPathAtPos((int)args.Event.X, (int)args.Event.Y, out path); if (path == null) return; if ((args.Event.Button == 1) && (args.Event.Type == Gdk.EventType.TwoButtonPress)) { EditItem(); } else if ((args.Event.Button == 3) && (args.Event.Type == Gdk.EventType.ButtonPress)) { uint btn = args.Event.Button; uint time = args.Event.Time; itemContextMenu.Popup(null, null, null, btn, time); } } [GLib.ConnectBefore()] private void OnTvSearchResultKeyPressEvent(object o, Gtk.KeyPressEventArgs args) { if (args.Event.Key == Gdk.Key.Return) EditItem(); } private void OnTvSearchResultSelectionChanged(object o, EventArgs args) { TreeIter iter; if (!tvSearchResult.GetSelectedIter(out iter)) return; VolumeItem item = tvSearchResult.GetItem(iter); if (item == null) return; if (App.Settings.ShowItemInfo) itemInfo.ShowInfo(item, database); else if (itemInfo.Visible) itemInfo.Hide(); } [GLib.ConnectBefore()] private void OnWindowKeyPressEvent(object o, Gtk.KeyPressEventArgs args) { if (args.Event.Key == Gdk.Key.Escape) Close(); } private void OnDeleteEvent(object sender, DeleteEventArgs args) { Close(); } } // gui initialization public partial class ItemSearch : WindowBase { private SearchEntry txtSearchString; private Button btnSearch; private CategoryView tvCategory; private PageNavigation navi; private InfoBar infoBar; private SearchResultView tvSearchResult; private ItemInfo itemInfo; private Statusbar statusbar; private Menu itemContextMenu; protected override void BuildGui() { base.BuildGui(); bool itemInfoMinimized = App.Settings.ItemInfoMinimized2; // general window settings SetModal(); this.DefaultWidth = 800; this.DefaultHeight = 600; this.Title = S._("Search Items"); this.Icon = this.RenderIcon(Basenji.Icons.Icon.Stock_Find, IconSize.Menu); // vbOuter VBox vbOuter = new VBox(); vbOuter.Spacing = 0; // search box HBox hbSearch = new HBox(); hbSearch.Spacing = 6; hbSearch.BorderWidth = 6; string STR_DEFAULT = S._("default"); txtSearchString = new SearchEntry(); txtSearchString.ShowClearIcon = false; txtSearchString.PlaceholderText = S._("Search items"); txtSearchString.SetPresets(new Widgets.SearchEntryPreset[] { new Widgets.SearchEntryPreset(string.Format("filename ({0})", STR_DEFAULT), "filename:", null), new Widgets.SearchEntryPreset(string.Format("directoryname ({0})", STR_DEFAULT), "directoryname:", null), new Widgets.SearchEntryPreset("location", "location:", null), new Widgets.SearchEntryPreset("note", "note:", null), new Widgets.SearchEntryPreset("keywords", "keywords:", null), new Widgets.SearchEntryPreset("metadata", "metadata:", null), new Widgets.SearchEntryPreset("volume-title", "volume-title:", null), new Widgets.SearchEntryPreset("type [audio, video, image, text, directory]", "type =", "audio"), new Widgets.SearchEntryPreset("filesize", "filesize", "> 1mb") }); hbSearch.PackStart(txtSearchString.GetFallbackWrapper(), true, true, 0); btnSearch = CreateButton(Stock.Find, true, OnBtnSearchClicked); hbSearch.PackStart(btnSearch, false, false, 0); vbOuter.PackStart(hbSearch, false, false, 0); // hpaned HPaned hpaned = new HPaned(); hpaned.BorderWidth = 6; hpaned.Position = 200; // category ScrolledWindow swCategory = CreateScrolledView(out tvCategory, true); hpaned.Pack1(swCategory, false, false); // search results VBox vbRight = new VBox(); vbRight.Spacing = 6; infoBar = new InfoBar(); infoBar.Headline = S._("Quick tip:"); infoBar.Text = string.Format(S._("Click on the icon to the left of the search field to build advanced search queries.\nExample: {0}"), @"""holidays and type = video and filesize > 600mb"""); vbRight.PackStart(infoBar, false, false, 0); navi = new PageNavigation(); navi.PageSize = App.Settings.SearchResultPageSize; navi.EmptyCaption = S._("No search results."); vbRight.PackStart(navi, false, false, 0); ScrolledWindow swSearchResult = CreateScrolledView(out tvSearchResult, true); vbRight.PackStart(swSearchResult, true, true, 0); // item info itemInfo = new ItemInfo(); vbRight.PackStart(itemInfo, false, false, 0); hpaned.Pack2(vbRight, true, true); vbOuter.PackStart(hpaned, true, true, 0); // statusbar statusbar = new Statusbar(); statusbar.Spacing = 6; vbOuter.PackStart(statusbar, false, false, 0); this.Add(vbOuter); // context menus itemContextMenu = CreateContextMenu(); // event handlers txtSearchString.Search += OnTxtSearchStringSearch; txtSearchString.Changed += OnTxtSearchStringChanged; tvCategory.Selection.Changed += OnTvCategorySelectionChanged; navi.Navigate += OnNaviNavigate; tvSearchResult.ButtonPressEvent += OnTvSearchResultButtonPressEvent; tvSearchResult.KeyPressEvent += OnTvSearchResultKeyPressEvent; tvSearchResult.Selection.Changed += OnTvSearchResultSelectionChanged; this.KeyPressEvent += OnWindowKeyPressEvent; this.DeleteEvent += OnDeleteEvent; ShowAll(); // must be called _after_ ShowAll() itemInfo.Minimized = itemInfoMinimized; navi.Visible = false; } private Menu CreateContextMenu() { ActionGroup ag = new ActionGroup("default"); ag.Add(WindowBase.CreateAction("edititem", S._("Edit Item"), null, Stock.Edit, (o, args) => EditItem()), null); ag.Add(WindowBase.CreateAction("show_in_mainwindow", S._("Show in Main Window"), null, Stock.Directory, (o, args) => ShowItemInMainWindow()), null); UIManager manager = new UIManager(); manager.InsertActionGroup(ag, 0); //this.AddAccelGroup(manager.AccelGroup); string ui = @" "; manager.AddUiFromString(ui); return (Menu)manager.GetWidget("/item_contextmenu"); } } } Basenji/src/Gui/MainWindow.cs0000664000175000017500000010774412067326706016253 0ustar patrickpatrick// MainWindow.cs // // Copyright (C) 2008 - 2012 Patrick Ulbrich // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // using System; using System.Collections.Generic; using System.Threading; using Gtk; using System.IO; using VolumeDB; using VolumeDB.Searching; using VolumeDB.Searching.VolumeSearchCriteria; using PlatformIO = Platform.Common.IO; namespace Basenji.Gui { public partial class MainWindow : Base.WindowBase { private VolumeDatabase database = null; private volatile bool windowDeleted; private ISearchCriteria lastSuccessfulSearchCriteria; private RecentManager recentManager; private readonly RecentData recentData = new RecentData() { AppName = App.Name, AppExec = App.Name.ToLower() + " %u", MimeType = "application/x-sqlite3", }; public MainWindow (string dbPath) { recentManager = RecentManager.Default; // retrieve the sort property from settings // (from default settings if the settings file does not exist yet) Widgets.VolumeSortProperty sp; bool desc; GetVolumeSortProperty(out sp, out desc); BuildGui(); windowDeleted = false; lastSuccessfulSearchCriteria = null; SetWindowTitle(null); EnableGui(false); // set the volumeview's sort property // (before filling it with volumes) tvVolumes.SetSortProperty(sp, desc); // create default db on first startup if (!App.Settings.SettingsFileExists()) { // creates (or opens existing) default db and if successful, // sets the db path and calls settings.Save() OpenOrCreateDefaultDB(false); return; } if (dbPath != null) { if (!File.Exists(dbPath)) { MsgDialog.ShowError(this, S._("Error"), S._("Database '{0}' not found."), dbPath); } else { // volumes list will be refreshed asynchronously OpenDB(dbPath, false, true, null); } return; } // reopen recent database dbPath = App.Settings.MostRecentDBPath; if (App.Settings.OpenMostRecentDB && dbPath.Length > 0) { if (!File.Exists(dbPath)) { MsgDialog.ShowError(this, S._("Error"), S._("Database '{0}' not found."), dbPath); // clear path so the error won't occur again on next startup App.Settings.MostRecentDBPath = string.Empty; App.Settings.Save(); } else { // volumes list will be refreshed asynchronously OpenDB(dbPath, false, true, null); } } } // finds the specified item: // - select owner volume // - expand the treeview path to the item // and select the item public void FindItem(VolumeItem item) { if (item == null) throw new ArgumentNullException("item"); // get path of volume ids to item Stack path = new Stack(); VolumeItem tmp = item; while (tmp.ItemID != 1) { // skip root item path.Push(tmp.ItemID); tmp = database.GetVolumeItem(tmp.VolumeID, tmp.ParentID); } // find and select volume of specified item TreeModel model = tvVolumes.Model; TreeIter iter; long volumeID = item.VolumeID; bool hasMoreIters = true; model.GetIterFirst(out iter); while (hasMoreIters) { Volume vol = tvVolumes.GetVolume(iter); if (vol.VolumeID == volumeID) { // select owner volume tvVolumes.Selection.SelectIter(iter); tvVolumes.ScrollToCell(model.GetPath(iter), null, false, .0f, .0f); if (path.Count > 0) { // find and select specified item tvItems.Model.GetIterFirst(out iter); FindItemRecursive(iter, path); } // else : specified item is the root item so select nothing break; } hasMoreIters = model.IterNext(ref iter); } } private void FindItemRecursive(TreeIter iter, Stack path) { TreeModel model = tvItems.Model; bool hasMoreIters = true; long itemID = path.Pop(); while (hasMoreIters) { VolumeItem item = tvItems.GetItem(iter); if (item.ItemID == itemID) { if (path.Count > 0) { tvItems.ExpandRow(model.GetPath(iter), false); model.IterChildren(out iter, iter); FindItemRecursive(iter, path); } else { tvItems.Selection.SelectIter(iter); tvItems.ScrollToCell(model.GetPath(iter), null, false, .0f, .0f); } break; } hasMoreIters = model.IterNext(ref iter); } } private void OpenOrCreateDefaultDB(bool confirmCreation) { // do not overwrite existing db if (File.Exists(App.DefaultDB)) { // opens existing default db and if successful, // sets the db path and calls settings.Save() OpenDB(App.DefaultDB, false, true, null); } else { if (confirmCreation && !(MsgDialog.Show(this, MessageType.Question, ButtonsType.YesNo, S._("Database not found"), S._("Default database not found. Create?")) == ResponseType.Yes)) { return; } // creates default db and if successful, // sets the db path and calls settings.Save() OpenDB(App.DefaultDB, true, true, null); } } private void OpenDB(string path, bool createNew, bool loadAsync, System.Action onsuccess) { EnableGui(false); // will be re-enabled after opening AND loading has been completed successfully SetWindowTitle(null); // clear views tvVolumes.Clear(); tvItems.Clear(); itemInfo.Clear(); itemInfo.Hide(); if (database != null) database.Close(); lastSuccessfulSearchCriteria = null; try { database = new VolumeDatabase(path, createNew); database.SearchItemResultsLimit = App.SEARCH_RESULTS_LIMIT; } catch (UnsupportedDbVersionException) { MsgDialog.ShowError(this, S._("Unsupported database version"), S._("This database version is not supported.")); return; } // load volumes Action updateGui = (Volume[] volumes) => { tvVolumes.Fill(volumes); // select first volume /* // this clearly harms startup time. TreeIter iter; if (tvVolumes.Model.GetIterFirst(out iter)) tvVolumes.Selection.SelectIter(iter); */ EnableGui(true); SetWindowTitle(path); SetTempStatus(string.Format(S._("{0} volumes loaded."), volumes.Length)); recentManager.AddFull("file://" + path, recentData); App.Settings.MostRecentDBPath = path; App.Settings.Save(); if (onsuccess != null) onsuccess(); // must be called on the gui thread }; if (loadAsync) { // delegate that will be called // when asynchronous volume loading (searching) has been finished. AsyncCallback cb = (IAsyncResult ar) => { Volume[] volumes; try { volumes = database.EndSearchVolume(ar); } catch (Exception ex) { Application.Invoke(delegate { SetStatus(string.Format(S._("An error occured while loading the volume list: {0}"), ex.Message)); }); return; } Application.Invoke(delegate { updateGui(volumes); }); }; database.BeginSearchVolume(cb, null); // returns immediately } else { Volume[] volumes = database.SearchVolume(); updateGui(volumes); } } private void EnableGui(bool enable) { actAddVolume.Sensitive = enable; actSearch.Sensitive = enable; actRemoveVolume.Sensitive = enable; actEditVolume.Sensitive = enable; actEditItem.Sensitive = enable; actImport.Sensitive = enable; actDBProperties.Sensitive = enable; txtSearchString.Sensitive = enable; } private void SetWindowTitle(string dbPath) { if (string.IsNullOrEmpty(dbPath)) this.Title = App.Name; else this.Title = string.Format("{0} - {1}", System.IO.Path.GetFileName(dbPath), App.Name); } private void SelectNewDB() { string db; ResponseType result = FileDialog.Show(FileChooserAction.Save, this, S._("Please enter the name for the new database"), out db); if (result == ResponseType.Ok && db.Length > 0) { if (System.IO.Path.GetExtension(db).Length == 0) db += ".vdb"; bool create = true; if (File.Exists(db)) create = (MsgDialog.Show(this, MessageType.Question, ButtonsType.YesNo, S._("Database exists"), S._("Database already exists. Overwrite?")) == ResponseType.Yes); if (create) { OpenDB(db, true, false, ShowDBProperties); // no async list refresh necessary - new database //ShowDBProperties(); } } } private void SelectExistingDB() { string db; ResponseType result = FileDialog.Show(FileChooserAction.Open, this, S._("Please select a database"), out db); if (result == ResponseType.Ok && db.Length > 0) { // check if the file existst before calling OpenDB() // so the currently loaded db won't be unloaded. if (!File.Exists(db)) MsgDialog.ShowError(this, S._("Error"), S._("Database not found.")); else OpenDB(db, false, true, null); } } private void ShowDBProperties() { DBProperties dbp = new DBProperties(database); dbp.Show(); } private void AddVolume() { PlatformIO.DriveInfo drive; if (App.Settings.ScannerDevice.Length > 0) { try { drive = PlatformIO.DriveInfo.FromDevice(App.Settings.ScannerDevice); } catch(ArgumentException e) { // e.g. drive not found MsgDialog.ShowError(this, S._("Error"), S._("An error occured while accessing drive {0}:\n{1}"), App.Settings.ScannerDevice, e.Message); return; } } else { DriveSelection ds = new DriveSelection(); ResponseType result = (ResponseType)ds.Run(); ds.Destroy(); if (result != ResponseType.Ok) return; drive = ds.SelectedDrive; } if (!drive.IsReady) { MsgDialog.ShowError(this, S._("Error"), S._("Drive {0} is not ready."), drive.Device); // e.g. no volume inserted return; } if (!drive.IsMounted && !drive.HasAudioCdVolume) { MsgDialog.ShowError(this, S._("Error"), S._("Drive {0} is neither mounted nor does it contain an audio cd."), drive.Device); return; } VolumeScanner vs = new VolumeScanner(database, drive); AddNewVolumeAddedEventHandler(vs); } private void RemoveVolume() { TreeIter iter; if (!tvVolumes.GetSelectedIter(out iter)) return; ResponseType result = MsgDialog.Show(this, MessageType.Question, ButtonsType.YesNo, S._("Confirmation"), S._("Are you sure you really want to remove the selected volume?")); if (result == ResponseType.Yes) PurgeVolume(iter); } private void EditVolume() { TreeIter iter; if (!tvVolumes.GetSelectedIter(out iter)) return; // load volume properties Volume volume = tvVolumes.GetVolume(iter); VolumeProperties vp = new VolumeProperties(volume); vp.Saved += delegate { tvVolumes.UpdateVolume(iter, volume); }; } private void EditItem() { TreeIter iter; if (!tvItems.GetSelectedIter(out iter)) return; // load item properties VolumeItem item = tvItems.GetItem(iter); // null -> not an item row (e.g. the "loading" row) if (item == null) return; new ItemProperties(item); // ip.Saved += delegate { // tvItems.UpdateItem(iter, item); // }; } private void PurgeVolume(TreeIter volumeIter) { Volume volume = tvVolumes.GetVolume(volumeIter); database.RemoveVolume(volume.VolumeID); // remove external db data string dbDataPath = PathUtil.GetDbDataPath(database); string volumeDataPath = DbData.GetVolumeDataPath(dbDataPath, volume.VolumeID); if (Directory.Exists(volumeDataPath)) Directory.Delete(volumeDataPath, true); tvVolumes.RemoveVolume(volumeIter); } private void AddNewVolumeAddedEventHandler(VolumeScanner vs) { vs.NewVolumeAdded += (object o, NewVolumeAddedEventArgs args) => { if (lastSuccessfulSearchCriteria != null) { // the volumes treeview is filtered, // so refill the treeview using the last sucessful searchcriteria. // (the freshly added volume may be matched by that criteria.) SearchVolumeAsync(lastSuccessfulSearchCriteria, null); } else { // volumes treeview isn't filtered and contains all volumes, // so just append. tvVolumes.AddVolume(args.Volume); } }; } private void BeginVolumeSearch() { ISearchCriteria criteria = null; if (txtSearchString.Text.Length > 0) { try { criteria = new EUSLSearchCriteria(txtSearchString.Text); } catch (ArgumentException e) { SetTempStatus(Util.FormatExceptionMsg(e)); return; } } System.Action oncompleted = () => { Application.Invoke(delegate { // treeview filling has stolen the focus. txtSearchString.GrabFocus(); }); }; SearchVolumeAsync(criteria, oncompleted); } private void SearchVolumeAsync(ISearchCriteria criteria, System.Action onsearchcompled) { // delegate that will be called // when asynchronous volume searching has been finished. AsyncCallback cb = (IAsyncResult ar) => { if (windowDeleted) return; try { Volume[] volumes = database.EndSearchVolume(ar); Application.Invoke(delegate { tvVolumes.Fill(volumes); SetStatus(string.Empty); // remember last successful searchcriteria // (that has been used to successfully fill the treeview). // (set in gtk thread to avoid race conditions.) lastSuccessfulSearchCriteria = (ISearchCriteria)ar.AsyncState; }); } catch (Exception e) { if (e is TimeoutException) { // couldn't get connection lock Application.Invoke(delegate { SetStatus(S._("Timeout: another search is probably still in progress.")); }); } else { Application.Invoke(delegate { //SetStatus(Util.FormatExceptionMsg(e)); SetStatus(string.Empty); }); throw; } } finally { if (onsearchcompled != null) onsearchcompled(); } }; try { SetStatus(S._("Searching...")); if (criteria != null) database.BeginSearchVolume(criteria, cb, criteria); else database.BeginSearchVolume(cb, null); } catch (Exception) { SetStatus(string.Empty); throw; } } private void SetStatus(string message) { statusbar.Pop(1); statusbar.Push(1, message); } private void SetTempStatus(string message) { SetStatus(message); GLib.Timeout.Add(3000, delegate { statusbar.Pop(1); return false; }); } private void Quit() { if (database != null) database.Close(); // save window state int w, h; bool isMaximized; this.GetSize(out w, out h); isMaximized = (this.GdkWindow.State == Gdk.WindowState.Maximized); App.Settings.MainWindowWidth = w; App.Settings.MainWindowHeight = h; App.Settings.MainWindowIsMaximized = isMaximized; App.Settings.MainWindowSplitterPosition = hpaned.Position; App.Settings.ItemInfoMinimized1 = itemInfo.Minimized; App.Settings.Save(); Application.Quit(); } private static string AppendDots(string s) { return string.Format("{0} ...", s); } private static void GetVolumeSortProperty(out Widgets.VolumeSortProperty sortProperty, out bool descending) { int sp = App.Settings.VolumeSortProperty; bool desc = false; if (sp < 0) { sp *= (-1); desc = true; } sortProperty = (Widgets.VolumeSortProperty)sp; descending = desc; } private static void SaveVolumeSortProperty(Widgets.VolumeSortProperty sortProperty, bool descending) { int sp = (int)sortProperty; if (descending) sp *= (-1); App.Settings.VolumeSortProperty = sp; App.Settings.Save(); } private void OnActAddVolumeActivated(object sender, System.EventArgs args) { AddVolume(); } private void OnActSearchActivated(object sender, System.EventArgs args) { ItemSearch s = new ItemSearch(this, database); s.Show(); } private void OnActShowAppMenuActivated(object sender, System.EventArgs args) { appMenu.Popup(null, null, null, 1, Gtk.Global.CurrentEventTime); } private void OnActNewDBActivated(object sender, System.EventArgs args) { SelectNewDB(); } private void OnActOpenDBActivated(object sender, System.EventArgs args) { SelectExistingDB(); } private void OnActOpenDefaultDBActivated(object sender, System.EventArgs args) { OpenOrCreateDefaultDB(true); } private void OnActRecentlyUsedActivated(object sender, System.EventArgs args) { RecentAction act = (RecentAction)sender; string path = act.CurrentUri.Replace("file://", string.Empty); if (!File.Exists(path)) { MsgDialog.ShowError(this, S._("Error"), S._("Database '{0}' not found."), path); return; } // volumes list will be refreshed asynchronously OpenDB(path, false, true, null); } private void OnActImportActivated(object sender, System.EventArgs args) { Import import = new Import(database); import.VolumesImported += delegate { if (lastSuccessfulSearchCriteria != null) { // the volumes treeview is filtered, // so refill the treeview using the last sucessful searchcriteria. // (the imported volumes may be matched by that criteria.) SearchVolumeAsync(lastSuccessfulSearchCriteria, null); } else { // volumes treeview isn't filtered and contains all volumes SearchVolumeAsync(null, null); } }; import.Show(); } private void OnActPreferencesActivated(object sender, System.EventArgs args) { Preferences p = new Preferences(); p.Show(); } private void OnActDBPropertiesActivated(object sender, System.EventArgs args) { ShowDBProperties(); } private void OnActInfoActivated(object sender, System.EventArgs args) { About a = new About(); a.Run(); a.Destroy(); } private void OnActQuitActivated(object sender, System.EventArgs args) { Quit(); } private void OnActEditVolumeActivated(object sender, System.EventArgs args) { EditVolume(); } private void OnActRemoveVolumeActivated(object sender, System.EventArgs args) { RemoveVolume(); } private void OnActRescanVolumeActivated(object sender, System.EventArgs args) { TreeIter iter; if (!tvVolumes.GetSelectedIter(out iter)) return; Volume oldVolume = tvVolumes.GetVolume(iter); WaitFunc IsVolumeConnected = delegate(out PlatformIO.DriveInfo dinf) { foreach (PlatformIO.DriveInfo di in PlatformIO.DriveInfo.GetDrives()) { if (di.IsReady && di.IsMounted && (di.DriveType.ToVolumeDriveType() == oldVolume.DriveType) && (di.VolumeLabel == oldVolume.Title)) { dinf = di; return true; } } dinf = null; return false; }; bool proceed = true; PlatformIO.DriveInfo drive; if (!IsVolumeConnected(out drive)) { string message = string.Format(S._("Please insert volume '{0}'."), Util.Escape(oldVolume.Title)); var wd = new WaitingDialog(IsVolumeConnected, message); wd.Title = S._("Waiting for volume"); if (wd.Run() == (int)ResponseType.Ok) { proceed = true; drive = wd.Value; } else { proceed = false; } wd.Destroy(); } if (proceed) { VolumeScanner vs = new VolumeScanner(database, drive); vs.VolumeEditor.Load(oldVolume); // remove old volume from the volume treeview and purge all associated data vs.NewVolumeAdded += (object o, NewVolumeAddedEventArgs a) => { PurgeVolume(iter); }; // add new volume to the volume treeview AddNewVolumeAddedEventHandler(vs); } } private void OnActEditItemActivated(object sender, System.EventArgs args) { EditItem(); } private void OnSortActionActivated(object sender, System.EventArgs args) { // do not sort / save settings // if an action is activated in buildGui() if (!buildGuiCompleted) return; Widgets.VolumeSortProperty sp = Widgets.VolumeSortProperty.Added; bool desc = actVolumesSortDescending.Active; if (sender == actVolumesSortDescending) { foreach (var a in volumeSortActions) { if (a.Active) { sp = (Widgets.VolumeSortProperty)a.Value; break; } } } else { // sortfield action RadioAction act = (RadioAction)sender; sp = (Widgets.VolumeSortProperty)act.Value; } tvVolumes.SetSortProperty(sp, desc); SaveVolumeSortProperty(sp, desc); } [GLib.ConnectBefore()] private void OnTvVolumesButtonPressEvent(object o, ButtonPressEventArgs args) { TreePath path; tvVolumes.GetPathAtPos((int)args.Event.X, (int)args.Event.Y, out path); if ((args.Event.Button == 1) && (args.Event.Type == Gdk.EventType.TwoButtonPress)) { if (path != null) EditVolume(); } else if ((args.Event.Button == 3) && (args.Event.Type == Gdk.EventType.ButtonPress)) { // re-enqueue into gtk mainloop since // the row that has been right-clicked is not selected yet // (iter is off by one in this event). Application.Invoke(delegate { if (path == null) { // show "sort by" action only actRemoveVolume.Visible = false; actEditVolume.Visible = false; actRescanVolume.Visible = false; } else { actRemoveVolume.Visible = true; actEditVolume.Visible = true; actRescanVolume.Visible = true; TreeIter iter; tvVolumes.GetSelectedIter(out iter); Volume volume = tvVolumes.GetVolume(iter); actRescanVolume.Sensitive = ((volume.DriveType == VolumeDriveType.Removable) || (volume.DriveType == VolumeDriveType.Harddisk) || (volume.DriveType == VolumeDriveType.Network) || ((volume.DriveType == VolumeDriveType.CDRom) && (volume.GetVolumeType() != VolumeType.AudioCdVolume))); } uint btn = args.Event.Button; uint time = args.Event.Time; volumeContextMenu.Popup(null, null, null, btn, time); }); } } [GLib.ConnectBefore()] private void OnTvVolumesKeyPressEvent(object o, Gtk.KeyPressEventArgs args) { switch (args.Event.Key) { case Gdk.Key.Return: EditVolume(); break; case Gdk.Key.Delete: RemoveVolume(); break; } } private void OnTvVolumesSelectionChanged(object o, EventArgs args) { tvItems.Clear(); itemInfo.Clear(); itemInfo.Hide(); TreeIter iter; if (!tvVolumes.GetSelectedIter(out iter)) return; // load volume content in the item tree Volume volume = tvVolumes.GetVolume(iter); tvItems.FillRoot(volume, database); } [GLib.ConnectBefore()] private void OnTvItemsButtonPressEvent(object o, ButtonPressEventArgs args) { TreePath path; tvItems.GetPathAtPos((int)args.Event.X, (int)args.Event.Y, out path); if (path == null) return; if ((args.Event.Button == 1) && (args.Event.Type == Gdk.EventType.TwoButtonPress)) { EditItem(); } else if ((args.Event.Button == 3) && (args.Event.Type == Gdk.EventType.ButtonPress)) { uint btn = args.Event.Button; uint time = args.Event.Time; itemContextMenu.Popup(null, null, null, btn, time); } } [GLib.ConnectBefore()] private void OnTvItemsKeyPressEvent(object o, Gtk.KeyPressEventArgs args) { if (args.Event.Key == Gdk.Key.Return) EditItem(); } private void OnTvItemsSelectionChanged(object o, EventArgs args) { // get selected item TreeIter iter; if (!tvItems.GetSelectedIter(out iter)) return; VolumeItem item = tvItems.GetItem(iter); // null -> not an item row (e.g. the "loading" row) if (item == null) return; if (App.Settings.ShowItemInfo) itemInfo.ShowInfo(item, database); else if (itemInfo.Visible) itemInfo.Hide(); } private void OnTxtSearchStringSearch(object o, Widgets.SearchEventArgs args) { BeginVolumeSearch(); } private void OnDeleteEvent(object sender, DeleteEventArgs args) { windowDeleted = true; Quit(); args.RetVal = true; } } // gui initialization public partial class MainWindow : Base.WindowBase { // toolbar actions private Gtk.Action actAddVolume; private Gtk.Action actSearch; private Gtk.Action actShowAppMenu; // app menu actions private Gtk.Action actNewDB; private Gtk.Action actOpenDB; private Gtk.Action actOpenDefaultDB; private Gtk.RecentAction actRecentlyUsed; private Gtk.Action actImport; private Gtk.Action actPreferences; private Gtk.Action actDBProperties; private Gtk.Action actInfo; private Gtk.Action actQuit; // context menu actions private Gtk.Action actRemoveVolume; private Gtk.Action actEditVolume; private Gtk.Action actRescanVolume; private Gtk.Action actEditItem; private Gtk.Action actVolumesSortBy; private Gtk.ToggleAction actVolumesSortDescending; private Gtk.RadioAction[] volumeSortActions; // toolbar private Toolbar toolbar; // app menu private Menu appMenu; // context menus private Menu volumeContextMenu; private Menu itemContextMenu; // search entry private Widgets.SearchEntry txtSearchString; // treeviews private Widgets.VolumeView tvVolumes; private Widgets.ItemView tvItems; // HPanned private HPaned hpaned; // iteminfo private Widgets.ItemInfo itemInfo; // statusbar private Statusbar statusbar; private bool buildGuiCompleted = false; protected override void BuildGui() { base.BuildGui(); // restore window state int w = App.Settings.MainWindowWidth; int h = App.Settings.MainWindowHeight; bool isMaximized = App.Settings.MainWindowIsMaximized; int splitterPos = App.Settings.MainWindowSplitterPosition; bool itemInfoMinimized = App.Settings.ItemInfoMinimized1; // general window settings this.DefaultWidth = w; this.DefaultHeight = h; if (isMaximized) this.Maximize(); // vbOuter VBox vbOuter = new VBox(); vbOuter.Spacing = 0; // actiongroup ActionGroup ag = new ActionGroup("default"); // // toolbar actions // actAddVolume = CreateAction("addvolume", S._("Add Volume"), null, Stock.Add, OnActAddVolumeActivated); actAddVolume.IsImportant = true; ag.Add(actAddVolume); actSearch = CreateAction("searchitems", S._("Search"), null, Stock.Find, OnActSearchActivated); ag.Add(actSearch); actShowAppMenu = CreateAction("show_appmenu", S._("App Menu"), null, Stock.Properties, OnActShowAppMenuActivated); ag.Add(actShowAppMenu); // // app menu actions // actNewDB = CreateAction("newdb", AppendDots(S._("_New Database")), null, Stock.New, OnActNewDBActivated); ag.Add(actNewDB, "N"); actOpenDB = CreateAction("opendb", AppendDots(S._("_Open Database")), null, Stock.Open, OnActOpenDBActivated); ag.Add(actOpenDB, "O"); actOpenDefaultDB = CreateAction("open_default_db", S._("Open Default Database"), null, null, OnActOpenDefaultDBActivated); ag.Add(actOpenDefaultDB); RecentFilter filter = new RecentFilter(); filter.AddPattern("*.vdb"); actRecentlyUsed = new RecentAction("recent_files", S._("Recent Databases"), null, null, recentManager); actRecentlyUsed.ShowNumbers = true; actRecentlyUsed.SortType = RecentSortType.Mru; actRecentlyUsed.AddFilter(filter); actRecentlyUsed.ItemActivated += OnActRecentlyUsedActivated; ag.Add(actRecentlyUsed); actImport = CreateAction("import", AppendDots(S._("_Import")), null, null, OnActImportActivated); ag.Add(actImport, "I"); actPreferences = CreateAction("preferences", S._("_Preferences"), null, Stock.Preferences, OnActPreferencesActivated); ag.Add(actPreferences, "P"); actDBProperties = CreateAction("dbproperties", S._("_Database Properties"), null, Stock.Properties, OnActDBPropertiesActivated); ag.Add(actDBProperties, "D"); actInfo = CreateAction("info", S._("Info"), null, Stock.About, OnActInfoActivated); ag.Add(actInfo); actQuit = CreateAction("quit", S._("_Quit"), null, Stock.Quit, OnActQuitActivated); ag.Add(actQuit, "Q"); // // volume context menu actions // actEditVolume = CreateAction("editvolume", S._("_Edit Volume"), null, Stock.Edit, OnActEditVolumeActivated); ag.Add(actEditVolume, "E"); actRemoveVolume = CreateAction("removevolume", S._("_Remove Volume"), null, Stock.Remove, OnActRemoveVolumeActivated); ag.Add(actRemoveVolume, "R"); actRescanVolume = CreateAction("rescanvolume", S._("Rescan Volume"), null, Stock.Refresh, OnActRescanVolumeActivated); ag.Add(actRescanVolume, "S"); // // item context menus // actEditItem = CreateAction("edititem", S._("Edit Item"), null, Stock.Edit, OnActEditItemActivated); ag.Add(actEditItem); // // sort context menu actions // actVolumesSortBy = CreateAction("volumes_sortby", S._("Sort by"), null, null, null); ag.Add(actVolumesSortBy); actVolumesSortDescending = CreateToggleAction("volumes_sortdescending", S._("Descending"), null, null, OnSortActionActivated); ag.Add(actVolumesSortDescending); RadioAction tmp = CreateRadioAction("volumes_sortby_archiveno", S._("Archive No."), null, null, (int)Widgets.VolumeSortProperty.ArchiveNo, null, OnSortActionActivated); volumeSortActions = new Gtk.RadioAction[] { tmp, CreateRadioAction("volumes_sortby_added", S._("Date added"), null, null, (int)Widgets.VolumeSortProperty.Added, tmp.Group, OnSortActionActivated), CreateRadioAction("volumes_sortby_title", S._("Title"), null, null, (int)Widgets.VolumeSortProperty.Title, tmp.Group, OnSortActionActivated), CreateRadioAction("volumes_sortby_drivetype", S._("Drivetype"), null, null, (int)Widgets.VolumeSortProperty.DriveType, tmp.Group, OnSortActionActivated), CreateRadioAction("volumes_sortby_category", S._("Category"), null, null, (int)Widgets.VolumeSortProperty.Category, tmp.Group, OnSortActionActivated) }; // retrieve sort property from settings Widgets.VolumeSortProperty sp; bool desc; GetVolumeSortProperty(out sp, out desc); foreach (var a in volumeSortActions) { ag.Add(a, null); if (a.Value == (int)sp) a.Active = true; } actVolumesSortDescending.Active = desc; // // ui manager // UIManager manager = new UIManager(); manager.InsertActionGroup(ag, 0); this.AddAccelGroup(manager.AccelGroup); string ui = @" "; manager.AddUiFromString(ui); appMenu = (Menu)manager.GetWidget("/appmenu"); toolbar = (Toolbar)manager.GetWidget("/toolbar"); volumeContextMenu = (Menu)manager.GetWidget("/volume_contextmenu"); itemContextMenu = (Menu)manager.GetWidget("/item_contextmenu"); // gtk will use SmallToolbar on windows by default // (no custom icons available for this size) toolbar.IconSize = IconSize.LargeToolbar; toolbar.ToolbarStyle = Gtk.ToolbarStyle.BothHoriz; toolbar.ShowArrow = false; vbOuter.PackStart(toolbar, false, false, 0); // hpaned hpaned = new HPaned(); hpaned.BorderWidth = 6; //hpaned.CanFocus = true; hpaned.Position = splitterPos; // left vbox VBox vbLeft = new VBox(); vbLeft.Spacing = 6; // left scrolled window / treeview (volumes) ScrolledWindow swLeft = CreateScrolledView(out tvVolumes, true); vbLeft.PackStart(swLeft, true, true, 0); // volumes filter entry txtSearchString = new Widgets.SearchEntry(); txtSearchString.PlaceholderText = S._("Filter volumes"); txtSearchString.SetPresets(new Widgets.SearchEntryPreset[] { new Widgets.SearchEntryPreset(string.Format("title ({0})", S._("default")), "title:", null), new Widgets.SearchEntryPreset("loanedto", "loanedto:", null), new Widgets.SearchEntryPreset("description", "description:", null), new Widgets.SearchEntryPreset("keywords", "keywords:", null), new Widgets.SearchEntryPreset("files", "files", "< 10"), new Widgets.SearchEntryPreset("dirs", "dirs", "< 10"), new Widgets.SearchEntryPreset("size", "size", "> 700mb") }); vbLeft.PackStart(txtSearchString.GetFallbackWrapper(), false, false, 0); hpaned.Pack1(vbLeft, false, false); // right vbox VBox vbRight = new VBox(); vbRight.Spacing = 6; // right scrolled window / treeview (items) ScrolledWindow swRight = CreateScrolledView(out tvItems, true); //tvItems.HeadersVisible = false; vbRight.PackStart(swRight, true, true, 0); // item info itemInfo = new Widgets.ItemInfo(); vbRight.PackStart(itemInfo, false, false, 0); hpaned.Pack2(vbRight, false, false); vbOuter.PackStart(hpaned, true, true, 0); // statusbar statusbar = new Statusbar(); statusbar.Spacing = 6; vbOuter.PackStart(statusbar, false, false, 0); this.Add(vbOuter); // eventhandlers txtSearchString.Search += OnTxtSearchStringSearch; tvVolumes.Selection.Changed += OnTvVolumesSelectionChanged; tvVolumes.ButtonPressEvent += OnTvVolumesButtonPressEvent; tvVolumes.KeyPressEvent += OnTvVolumesKeyPressEvent; tvItems.ButtonPressEvent += OnTvItemsButtonPressEvent; tvItems.KeyPressEvent += OnTvItemsKeyPressEvent; tvItems.Selection.Changed += OnTvItemsSelectionChanged; this.DeleteEvent += OnDeleteEvent; ShowAll(); // must be called _after_ ShowAll() itemInfo.Minimized = itemInfoMinimized; itemInfo.Hide(); buildGuiCompleted = true; } } } Basenji/src/Gui/Import.cs0000664000175000017500000001652712067326706015447 0ustar patrickpatrick/// Import.cs // // Copyright (C) 2010, 2012 Patrick Ulbrich // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // using System; using Gtk; using Basenji.Gui.Base; using VolumeDB; using VolumeDB.Import; namespace Basenji.Gui { public partial class Import : Base.WindowBase { private static readonly string LBL_IMPORT = S._("Import"); private static readonly string LBL_ABORT = S._("Abort"); private static readonly string LBL_FORMAT_EMPTY = S._("Please select a database."); private VolumeDatabase database; private IImport import; public Import (VolumeDatabase db) { this.database = db; this.import = null; BuildGui(); btnImport.Sensitive = false; // will be enabled on file selection } public event EventHandler VolumesImported; protected virtual void OnVolumesImported() { if (VolumesImported != null) VolumesImported(this, new EventArgs()); } private void OnBtnImportClicked(object sender, EventArgs e) { if (import != null && import.IsBusy) { import.CancelAsync(); btnImport.Sensitive = false; } else { progress.Fraction = .0; progress.Text = string.Empty; import.RunAsync(); btnImport.Label = LBL_ABORT; btnClose.Sensitive = false; fcDatabase.Sensitive = false; } } private void OnImportProgressUpdate(object sender, ProgressUpdateEventArgs e) { Application.Invoke(delegate { progress.Fraction = e.Completed / 100.0; progress.Text = string.Format(S._("{0:0}% completed."), e.Completed); }); } private void OnImportCompleted(object sender, ImportCompletedEventArgs e) { try { Application.Invoke(delegate { if (e.Error != null) { if (e.Error is System.IO.FileNotFoundException) { MsgDialog.ShowError(this, S._("Import failed"), S._("Database not found.")); } progress.Text = S._("Import failed!"); } else if (e.Cancelled) { progress.Text = S._("Import aborted."); } else { progress.Text = S._("Import completed successfully."); OnVolumesImported(); } }); } finally { Application.Invoke(delegate { btnClose.Sensitive = true; fcDatabase.Sensitive = true; btnImport.Sensitive = true; btnImport.Label = LBL_IMPORT; }); } } private void OnBtnCloseClicked(object sender, EventArgs e) { this.Destroy(); } [GLib.ConnectBefore()] private void OnWindowKeyPressEvent(object o, Gtk.KeyPressEventArgs args) { if (args.Event.Key == Gdk.Key.Escape) { if (import != null && import.IsBusy) { import.CancelAsync(); btnImport.Sensitive = false; } else { this.Destroy(); } } } private void OnDeleteEvent(object o, Gtk.DeleteEventArgs args) { if (import != null && import.IsBusy) { MsgDialog.ShowError(this, S._("Import in progress"), S._("You must stop the import before closing this window.")); args.RetVal = true; } } private void OnFcDatabaseSelectionChanged (object sender, EventArgs e) { if (string.IsNullOrEmpty(fcDatabase.Filename)) { import = null; lblFormat.Text = LBL_FORMAT_EMPTY; btnImport.Sensitive = false; return; } string sourceDbPath = fcDatabase.Filename; string dbDataPath = PathUtil.GetDbDataPath(database); int buffSize = App.Settings.ScannerBufferSize; string ext = System.IO.Path.GetExtension(sourceDbPath); if (ext.Length == 0) import = null; else import = AbstractImport.GetImportByExtension(ext.Substring(1), sourceDbPath, database, dbDataPath, buffSize); if (import == null) { lblFormat.Text = S._("Unknown format."); btnImport.Sensitive = false; } else { import.ProgressUpdate += OnImportProgressUpdate; import.ImportCompleted += OnImportCompleted; lblFormat.Text = import.Name; btnImport.Sensitive = true; } } } // gui initialization public partial class Import : Base.WindowBase { private FileChooserButton fcDatabase; private Label lblFormat; private ProgressBar progress; private Button btnImport; private Button btnClose; protected override void BuildGui() { base.BuildGui(); // general window settings SetModal(); //this.DefaultWidth = 320; this.Title = S._("Import Database"); // vbOuter VBox vbOuter = new VBox(); vbOuter.BorderWidth = 0; vbOuter.Spacing = 0; // tblDatabase Table tblDatabase = WindowBase.CreateTable(2, 2); tblDatabase.BorderWidth = 12; fcDatabase = new FileChooserButton(S._("Please select a database to import"), FileChooserAction.Open); // set min width of the filechooser widget // (translated labels may make it smaller otherwise) fcDatabase.WidthRequest = 220; FileFilter allFilter = new FileFilter(); allFilter.Name = S._("All supported formats"); fcDatabase.AddFilter(allFilter); foreach (var ext in AbstractImport.GetSupportedExtensions()) { FileFilter ff = new FileFilter(); ff.Name = string.Format(S._ (".{0} files"), ext); ff.AddPattern("*." + ext); fcDatabase.AddFilter(ff); allFilter.AddPattern("*." + ext); } lblFormat = WindowBase.CreateLabel(LBL_FORMAT_EMPTY); AttachOptions xAttachOpts = AttachOptions.Expand | AttachOptions.Fill; AttachOptions yAttachOpts = AttachOptions.Fill; WindowBase.TblAttach(tblDatabase, WindowBase.CreateLabel(S._("Database:")), 0, 0); WindowBase.TblAttach(tblDatabase, WindowBase.CreateLabel(S._("Format:")), 0, 1); WindowBase.TblAttach(tblDatabase, fcDatabase, 1, 0, xAttachOpts, yAttachOpts); WindowBase.TblAttach(tblDatabase, lblFormat, 1, 1, xAttachOpts, yAttachOpts); vbOuter.PackStart(tblDatabase, true, true, 0); // progressbar and button HBox hbProgress = new HBox(); hbProgress.BorderWidth = 12; hbProgress.Spacing = 6; progress = new ProgressBar(); hbProgress.PackStart(progress, true, true, 0); btnImport = WindowBase.CreateButton(LBL_IMPORT, false, OnBtnImportClicked); hbProgress.PackStart(btnImport, false, false, 0); vbOuter.PackStart(hbProgress, true, false, 0); // separator vbOuter.PackStart(new HSeparator(), true, true, 0); // close button HBox hbClose = new HBox(); hbClose.BorderWidth = 12; hbClose.Spacing = 6; btnClose = WindowBase.CreateButton(Stock.Close, true, OnBtnCloseClicked); hbClose.PackEnd(btnClose, false, false, 0); vbOuter.PackStart(hbClose, false, false, 0); this.Add(vbOuter); // event handlers this.KeyPressEvent += OnWindowKeyPressEvent; this.DeleteEvent += OnDeleteEvent; fcDatabase.SelectionChanged += OnFcDatabaseSelectionChanged; ShowAll(); } } } Basenji/src/Gui/ItemProperties.cs0000664000175000017500000000202512067326706017134 0ustar patrickpatrick// ItemProperties.cs // // Copyright (C) 2010 Patrick Ulbrich // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // using System; using Basenji.Gui.Widgets.Editors; using VolumeDB; namespace Basenji.Gui { public class ItemProperties: ObjectProperties { public ItemProperties(VolumeItem item) : base(item, S._("Item Properties"), ItemEditor.CreateInstance(item.GetVolumeItemType()), 0, 350) {} } }Basenji/src/Gui/VolumeScanner.cs0000664000175000017500000004204512067326706016750 0ustar patrickpatrick// VolumeScanner.cs // // Copyright (C) 2008 - 2012 Patrick Ulbrich // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // using System; using System.Text; using System.Collections.Generic; using IO = System.IO; using Gtk; using Gdk; using Basenji.Gui.Widgets; using Basenji.Gui.Widgets.Editors; using Platform.Common.IO; using VolumeDB; using VolumeDB.VolumeScanner; using VolumeDB.Metadata; namespace Basenji.Gui { public partial class VolumeScanner : Base.WindowBase { private const IconSize ICON_SIZE = IconSize.Menu; private Gdk.Pixbuf infoIcon; private Gdk.Pixbuf warningIcon; private Gdk.Pixbuf errorIcon; private ListStore logStore; private VolumeDatabase database; private IVolumeScanner scanner; private MetadataProvider[] mdps; private StringBuilder scannerLog; private StatusUpdateTimer timer; private volatile bool scanCompleted; private Volume newVolume; public VolumeScanner(VolumeDatabase db, DriveInfo drive) { this.scanCompleted = false; this.database = db; this.newVolume = null; infoIcon = RenderIcon(Icons.Icon.Stock_DialogInfo, ICON_SIZE); warningIcon = RenderIcon(Icons.Icon.Stock_DialogWarning, ICON_SIZE); errorIcon = RenderIcon(Icons.Icon.Stock_DialogError, ICON_SIZE); mdps = null; if (App.Settings.ScannerExtractMetaData && (VolumeProber.ProbeVolume(drive) == VolumeProber.VolumeProbeResult.Filesystem)) { mdps = new MetadataProvider[] { new TagLibMetadataProvider(), new ArchiveMetadataProvider() }; } // setup scanner options ScannerOptions[] opts = new ScannerOptions[2] { new FilesystemScannerOptions() { BufferSize = App.Settings.ScannerBufferSize, ComputeHashs = App.Settings.ScannerComputeHashs, DiscardSymLinks = App.Settings.ScannerDiscardSymLinks, GenerateThumbnails = App.Settings.ScannerGenerateThumbnails, MetadataProviders = mdps, DbDataPath = PathUtil.GetDbDataPath(database) }, new AudioCdScannerOptions() { EnableMusicBrainz = App.Settings.ScannerEnableMusicBrainz } }; scanner = VolumeProber.GetScannerForVolume(drive, database, opts); // scanner eventhandlers scanner.BeforeScanItem += scanner_BeforeScanItem; scanner.ScannerWarning += scanner_ScannerWarning; scanner.Error += scanner_Error; scanner.ScanCompleted += scanner_ScanCompleted; /* volumedatabase event handlers */ database.BeginWriteAccess += database_BeginWriteAccess; database.EndWriteAccess += database_EndWriteAccess; // must be called _after_ scanner instanciation // (requires scanner.VolumeInfo.GetVolumeType()) BuildGui(); InitTreeView(); scannerLog = new StringBuilder(); timer = new StatusUpdateTimer(this); try { /* NOTE: make sure the timer will be removed properly later, * or it keeps running, even if this window has been closed. */ timer.Install(); string tmp; // e.g. GIO network 'drives' do not have a devicefile if (string.IsNullOrEmpty(drive.Device)) tmp = S._("Scanning started."); else tmp = string.Format(S._("Scanning of drive '{0}' started."), drive.Device); UpdateLog(LogIcon.Info, tmp); switch (scanner.VolumeInfo.GetVolumeType()) { case VolumeType.FileSystemVolume: UpdateLog(LogIcon.Info, string.Format(S._("Options: generate thumbs: {0}, extract metadata: {1}, discard symlinks: {2}, hashing: {3}."), BoolToStr(App.Settings.ScannerGenerateThumbnails), BoolToStr(App.Settings.ScannerExtractMetaData), BoolToStr(App.Settings.ScannerDiscardSymLinks), BoolToStr(App.Settings.ScannerComputeHashs))); break; case VolumeType.AudioCdVolume: UpdateLog(LogIcon.Info, string.Format(S._("Options: MusicBrainz enabled: {0}"), BoolToStr(App.Settings.ScannerEnableMusicBrainz))); break; default: throw new NotImplementedException(string.Format("Missing options output for scannertyp {0}", scanner.GetType())); } if (scanner.VolumeInfo.GetVolumeType() == VolumeType.FileSystemVolume) { // copy already known volume data into the editor volEditor.ArchiveNo = scanner.VolumeInfo.ArchiveNo; volEditor.Title = scanner.VolumeInfo.Title; } else { // other volumetypes have no useful data yet (e.g. AudioCD data may be queried from musicbrainz.org), // so disable the editor and re-enable it and fill in the data when scanning has been completed. volEditor.Sensitive = false; } // start scanning on a new thread and return immediately scanner.RunAsync(); } catch { timer.Remove(); throw; } } private void InitTreeView() { TreeViewColumn col; col = new TreeViewColumn(string.Empty, new CellRendererPixbuf() { Xpad = 2 }, "pixbuf", 0); col.Expand = false; tvLog.AppendColumn(col); col = new TreeViewColumn(S._("Time"), new CellRendererText(), "text", 1); col.Expand = false; tvLog.AppendColumn(col); col = new TreeViewColumn(S._("Message"), new CellRendererText(), "text", 2); col.Expand = true; tvLog.AppendColumn(col); logStore = new ListStore(typeof(Gdk.Pixbuf), typeof(string), typeof(string)); tvLog.Model = logStore; } public VolumeEditor VolumeEditor { get { return volEditor; } } private void UpdateLog(LogIcon icon, string message) { Pixbuf pb; string messageType; string timeStr = DateTime.Now.ToShortTimeString(); switch(icon) { case LogIcon.Info: pb = infoIcon; messageType = "[ INFO ]"; break; case LogIcon.Warning: pb = warningIcon; messageType = "[WARNING]"; break; case LogIcon.Error: pb = errorIcon; messageType = "[ ERROR ]"; break; default: throw new Exception("Invalid LogIcon"); } logStore.AppendValues(pb, timeStr, message); scannerLog.AppendFormat("[{0}] {1} {2}\n", timeStr, messageType, message); } private void SetStatus(string message) { statusbar.Pop(1); statusbar.Push(1, message); } private void SaveLog(long volumeID) { string dbDataPath = PathUtil.GetDbDataPath(database); string volumeDataPath = DbData.GetVolumeDataPath(dbDataPath, volumeID); if (!IO.Directory.Exists(volumeDataPath)) IO.Directory.CreateDirectory(volumeDataPath); string logfile = IO.Path.Combine(volumeDataPath, "scanner.log"); using (IO.StreamWriter w = new IO.StreamWriter(IO.File.OpenWrite(logfile))) { w.WriteLine(string.Format("{0} scanner log ({0} version: {1}, VolumeDB version: {2}) saved on {3}", App.Name, App.Version, Util.GetVolumeDBVersion(), DateTime.Now.ToString("yyyyy-MM-dd"))); w.WriteLine(); w.WriteLine(scannerLog.ToString()); } } private bool SaveAndClose() { try { if (scanner.ScanSucceeded) { // SaveTo() may throw a ValidationException. // Note: The volumeditor has either been filled on scanner start manually // (no volume loaded) or an existing volume has been loaded into it // (via the public VolumeEditor property or via volEditor.Load() on scan completion). volEditor.SaveTo(newVolume); SaveLog(newVolume.VolumeID); OnNewVolumeAdded(newVolume); } this.Destroy(); if (scanner != null) scanner.Dispose(); if (mdps != null) { foreach (var m in mdps) m.Dispose(); } } catch (ValidationException e) { MsgDialog.ShowError(this, S._("Invalid data"), string.Format(S._("\"{0}\" is {1}.\n\nExpected format: {2}\nPlease correct or remove the data you entered."), e.WidgetName, e.Message, e.ExpectedFormat)); return false; } return true; } private void AbortScan() { if (!scanCompleted && btnAbort.Sensitive) { UpdateLog(LogIcon.Info, S._("Stopping Scanner and performing rollback...")); scanner.CancelAsync(); /* disable button, * it will be enabled and converted to a closebutton when the ScanCompleted event is triggered */ btnAbort.Sensitive = false; } } private static string BoolToStr(bool val) { return val ? S._("yes") : S._("no"); } public event NewVolumeAddedEventHandler NewVolumeAdded; protected virtual void OnNewVolumeAdded(Volume volume) { if (NewVolumeAdded != null) NewVolumeAdded(this, new NewVolumeAddedEventArgs(volume)); } #region window event handlers private void OnObjectDestroyed(object o, EventArgs args) { /* remove event handlers from the extern VolumeDatabase object */ database.BeginWriteAccess -= database_BeginWriteAccess; database.EndWriteAccess -= database_EndWriteAccess; //// remove timeout handler (installed in ctor) //// TODO : comment from GUI_PUSH.txt //m_timer.Remove(); } private void OnDeleteEvent(object o, Gtk.DeleteEventArgs args) { if (!scanCompleted) { MsgDialog.ShowError(this, S._("Scan in progress"), S._("You must stop scanning before closing this window.")); args.RetVal = true; } else { bool cancel = !SaveAndClose(); args.RetVal = cancel; } } [GLib.ConnectBefore()] private void OnWindowKeyPressEvent(object o, Gtk.KeyPressEventArgs args) { if (args.Event.Key == Gdk.Key.Escape) { if (!scanCompleted) AbortScan(); else SaveAndClose(); } } private void OnBtnAbortClicked(object sender, System.EventArgs args) { if (!scanCompleted) AbortScan(); else SaveAndClose(); } #endregion #region VolumeDatabase event handlers (executed on the scanner thread ?) // TODO : // what is the executing thread of those VolumeDB events rised on the VolumeDB by the VolumeScanner? // in case of a different thread, // is the VolumeScanner required to raise the event on the the tread of the VolumeDB? private void database_BeginWriteAccess(object sender, EventArgs e) { timer.RequestLedUpdate(true); // LED on } private void database_EndWriteAccess(object sender, EventArgs e) { timer.RequestLedUpdate(false); // LED off } #endregion #region Scanner event handlers (executed on the current threadcontext (i.e. gtk = no specific context -> new thread)) private void scanner_BeforeScanItem(object sender, BeforeScanItemEventArgs e) { Application.Invoke(delegate { SetStatus(e.ItemName); }); } private void scanner_ScannerWarning(object sender, ScannerWarningEventArgs e) { Application.Invoke(delegate { UpdateLog(LogIcon.Warning, e.Message); }); } private void scanner_Error(object sender, ErrorEventArgs e) { Application.Invoke(delegate { UpdateLog(LogIcon.Error, string.Format(S._("An unhandled exception occured ({0})."), e.Exception.Message)); UpdateLog(LogIcon.Info, S._("All database changes have been rolled back.")); }); } private void scanner_ScanCompleted(object sender, ScanCompletedEventArgs e) { Application.Invoke(delegate { if (e.Error != null) { UpdateLog(LogIcon.Error, string.Format(S._("Scanning failed. Reason: an unhandled exception occured ({0})."), e.Error.Message)); } else if (e.Cancelled) { UpdateLog(LogIcon.Error, S._("Scanning aborted.")); } else { UpdateLog(LogIcon.Info, S._("Scanning completed successfully.")); newVolume = e.Volume; // the volume editor may have been disabled in the ctor // for some volume types (e.g. AudioCD volumes) if (!volEditor.Sensitive) { volEditor.Load(newVolume); volEditor.Sensitive = true; } } if (!btnAbort.Sensitive) /* possibly disabled in AbortScan() */ btnAbort.Sensitive = true; btnAbort.Label = Stock.Close; scanCompleted = true; }); /* remove timeout handler (installed in ctor) */ timer.Remove(); } #endregion /* * Timer class that pulls scanner status values at a given interval * and updates the gui with them. */ private class StatusUpdateTimer { /* Assuming a display refresh rate (frequency) of at least 70 Hz, * the GUI update resolution shouldn't be smaller than (1000ms / 70Hz) = ~14ms */ private const uint TIMEOUT_INTERVAL = 20; private VolumeScanner vscanner; private volatile bool remove; private volatile bool ledOnRequest; private volatile bool ledOffRequest; private long lastLedUpdate; public StatusUpdateTimer(VolumeScanner vs) { this.vscanner = vs; this.remove = true; } public void Install() { if (!remove) return; remove = false; vscanner.led.LedState = false; ledOnRequest = false; ledOffRequest = false; GLib.Timeout.Add(TIMEOUT_INTERVAL, delegate { /* get local copies of thread shared vars */ bool persist = !remove; bool ledOnReq = ledOnRequest; bool ledOffReq = ledOffRequest; /* * update counter labels (expected to take less than 1ms) */ if (vscanner.scanner != null) vscanner.volEditor.UpdateInfo(vscanner.scanner.VolumeInfo); /* * update database write access indicator LED */ if (!persist) { /* switch off the LED when the timer is going to be removed */ vscanner.led.LedState = false; } else { if (ledOnReq) { if (!vscanner.led.LedState) vscanner.led.LedState = true; /* toggle LED state */ ledOnRequest = false; lastLedUpdate = DateTime.Now.Ticks; } /* switch off the LED if it hasn't been switched on during the last ~300 ms. * (i.e. make the LED glow for at least 300 ms) */ if ( vscanner.led.LedState && ledOffReq && (((DateTime.Now.Ticks - lastLedUpdate) / 10000) >= 300) ) vscanner.led.LedState = false; } return persist; }); } public void Remove() { remove = true; } public void RequestLedUpdate(bool on) { if (on) { /* remove possibly pending previous switch-off request */ ledOffRequest = false; /* request LED switch-on */ ledOnRequest = true; } else { /* don't disable the ledOnRequest here !*/ /* request LED switch-off */ ledOffRequest = true; } } } private enum LogIcon { Info = 0, Warning = 1, Error = 2 } } // gui initialization public partial class VolumeScanner : Base.WindowBase { private TreeView tvLog; private Button btnAbort; private Statusbar statusbar; private Led led; private VolumeEditor volEditor; protected override void BuildGui () { base.BuildGui(); // general window settings SetModal(); //this.DefaultWidth = 580; this.DefaultHeight = 600; this.Title = S._("VolumeScanner"); // vbOuter VBox vbOuter = new VBox(); vbOuter.Spacing = 0; // vbVolEditor VBox vbVolEditor = new VBox(); vbVolEditor.Spacing = 6; vbVolEditor.BorderWidth = 12; volEditor = VolumeEditor.CreateInstance(scanner.VolumeInfo.GetVolumeType()); vbVolEditor.PackStart(CreateLabel(S._("Volume Information:"), true, 0, 0), false, false, 0); vbVolEditor.PackStart(LeftAlign(volEditor), true, true, 0); vbOuter.PackStart(vbVolEditor, false, false, 0); // vbScannerLog VBox vbScannerLog = new VBox(); vbScannerLog.Spacing = 6; vbScannerLog.BorderWidth = 12; vbScannerLog.PackStart(CreateLabel(S._("Scanner Log:"), true, 0, 0), false, false, 0); ScrolledWindow sw = CreateScrolledView(out tvLog, false); // set min width of the scrolled window widget sw.WidthRequest = 520; vbScannerLog.PackStart(LeftAlign(sw), true, true, 0); vbOuter.PackStart(vbScannerLog, true, true, 0); // hbbox HButtonBox hbbox = new HButtonBox(); hbbox.Spacing = 6; hbbox.BorderWidth = 12; hbbox.LayoutStyle = ButtonBoxStyle.End; led = new Led(false); Alignment a = new Alignment(1.0f, 0.5f, 0.0f, 0.0f); led.TooltipText = S._("Database access"); a.Add(led); hbbox.PackStart(a, false, false, 0); btnAbort = CreateButton(Stock.Cancel, true, OnBtnAbortClicked); hbbox.PackEnd(btnAbort, false, false, 0); vbOuter.PackStart(hbbox, false, false, 0); // statusbar statusbar = new Statusbar(); statusbar.Spacing = 6; vbOuter.PackStart(statusbar, false, false, 0); this.Add(vbOuter); // event handlers this.KeyPressEvent += OnWindowKeyPressEvent; this.DeleteEvent += OnDeleteEvent; this.Destroyed += OnObjectDestroyed; ShowAll(); } } } Basenji/src/Gui/Preferences.cs0000664000175000017500000003236212067326706016431 0ustar patrickpatrick// Preferences.cs // // Copyright (C) 2008 - 2012 Patrick Ulbrich // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // // TODO: // alternate drive label captions: // "Scan without promt(ing)" "Ohne Nachfrage scannen" // "Don't prompt, just scan", "Frage nicht, scanne einfach:" // "Always scan this drive:" "Immer dieses Laufwerk scannen:" // "Scan this drive automatically:" using System; using System.IO; using System.Threading; using Gtk; using Gdk; using PlatformIO = Platform.Common.IO; namespace Basenji.Gui { public partial class Preferences : Base.WindowBase { private const string SYSTEM_ICON_THEME_NAME = "System"; private bool iconThemeChanged; private volatile bool loadingComplete; // public Preferences() { // BuildGui(); // FillIconThemes(); // FillDrives(); // ShowSettings(App.Settings); // iconThemeChanged = false; // must be set after FillIconThemes()! // } public Preferences() { BuildGui(); // disable the gui until async drive refreshing has been completed this.Child.Sensitive = false; loadingComplete = false; FillIconThemes(); // drive refreshing is implemented asynchronously, // because this operation may take a few seconds on windows systems. // ShowSettings() depends on FillDrives() so it must be called in the same thread. new Thread(delegate() { PlatformIO.DriveInfo[] drives = PlatformIO.DriveInfo.GetDrives(false); // get drives that are _not_ ready, too. Application.Invoke(delegate { FillDrives(drives); ShowSettings(App.Settings); iconThemeChanged = false; // must be set after FillIconThemes()! this.Child.Sensitive = true; loadingComplete = true; }); }).Start(); } private bool SaveAndClose() { if (!loadingComplete) return false; Save(); this.Destroy(); return true; } private void OnBtnCloseClicked(object sender, System.EventArgs e) { SaveAndClose(); } private void OnBtnResetClicked(object sender, System.EventArgs e) { ShowSettings(App.Settings.GetDefaults()); } private void OnDeleteEvent(object o, Gtk.DeleteEventArgs args) { bool cancel = !SaveAndClose(); args.RetVal = cancel; // cancel window deleting } [GLib.ConnectBefore()] private void OnWindowKeyPressEvent(object o, Gtk.KeyPressEventArgs args) { if (args.Event.Key == Gdk.Key.Escape) SaveAndClose(); } private void OnCmbIconThemeChanged(object o, EventArgs args) { iconThemeChanged = true; } private void FillDrives(PlatformIO.DriveInfo[] drives) { ListStore store = new ListStore(typeof(Pixbuf), typeof(string)); //string stockID; Pixbuf icon; //stockID = Stock.Cancel; icon = RenderIcon(Icons.Icon.Stock_Cancel, IconSize.Menu); store.AppendValues(icon, S._("None")); foreach (PlatformIO.DriveInfo d in drives) { // list removable drives only (auto scanning of fixed drives does not make sense) if (d.DriveType == PlatformIO.DriveType.CDRom || d.DriveType == PlatformIO.DriveType.Removable) { //stockID = Util.GetDriveStockIconID(d); //icon = this.RenderIcon(stockID, IconSize.Button, string.Empty); icon = RenderIcon(Icons.IconUtils.GetDriveIcon(d), IconSize.Menu); string text = d.Device; store.AppendValues(icon, text); } } CellRendererPixbuf pixbufCellRenderer = new CellRendererPixbuf(); CellRendererText textCellRenderer = new CellRendererText(); textCellRenderer.Xpad = 6; cmbScannerDevice.PackStart(pixbufCellRenderer, false); cmbScannerDevice.PackStart(textCellRenderer, false); cmbScannerDevice.AddAttribute(pixbufCellRenderer, "pixbuf", 0); cmbScannerDevice.AddAttribute(textCellRenderer, "text", 1); cmbScannerDevice.Model = store; } private void FillIconThemes() { cmbIconTheme.AppendText(SYSTEM_ICON_THEME_NAME); if (Directory.Exists(App.CUSTOM_THEME_PATH)) { DirectoryInfo[] customThemeDirs = (new DirectoryInfo(App.CUSTOM_THEME_PATH)).GetDirectories(); foreach (DirectoryInfo dir in customThemeDirs) cmbIconTheme.AppendText(dir.Name); } } private void ShowSettings(Basenji.Settings s) { TreeModel model; TreeIter iter; /* * general settings */ string customThemeName = s.CustomThemeName; model = cmbIconTheme.Model; // select "System" item cmbIconTheme.Active = 0; if (customThemeName.Length > 0) { // select custom icon theme for (int i = 0; i < model.IterNChildren(); i++) { model.IterNthChild(out iter, i); if ((string)model.GetValue(iter, 0) == customThemeName) { cmbIconTheme.SetActiveIter(iter); break; } } } chkReopenDB.Active = s.OpenMostRecentDB; chkShowItemInfo.Active = s.ShowItemInfo; chkShowThumbs.Active = s.ShowThumbsInItemLists; chkShowHiddenFiles.Active = s.ShowHiddenItems; /* * scanner settings */ string scannerDevice = s.ScannerDevice; model = cmbScannerDevice.Model; // select "none" device model.GetIterFirst(out iter); cmbScannerDevice.SetActiveIter(iter); if (scannerDevice.Length > 0) { // select settings device for (int i = 0; i < model.IterNChildren(); i++) { model.IterNthChild(out iter, i); if ((string)model.GetValue(iter, 1) == scannerDevice) { cmbScannerDevice.SetActiveIter(iter); break; } } } // scaleBufferSize.Value = s.ScannerBufferSize; chkGenerateThumbnails.Active = s.ScannerGenerateThumbnails; chkExtractMetaData.Active = s.ScannerExtractMetaData; chkDiscardSymLinks.Active = s.ScannerDiscardSymLinks; chkComputeHashs.Active = s.ScannerComputeHashs; chkMusicBrainz.Active = s.ScannerEnableMusicBrainz; } private void Save() { /* * general settings */ if (cmbIconTheme.ActiveText == SYSTEM_ICON_THEME_NAME) { // prevent non-GNOME users from changing the only custom theme (Tango) // into the incomplete and ugly GTK default theme. if (Platform.Common.Diagnostics.CurrentPlatform.IsGnome) { App.Settings.CustomThemeName = string.Empty; } else { if (iconThemeChanged) { MsgDialog.Show(this, MessageType.Error, ButtonsType.Ok, S._("Unsupported theme"), string.Format(S._("The selected icon theme is currently not supported on your system."))); // do not notify that a restart is required iconThemeChanged = false; } } } else { App.Settings.CustomThemeName = cmbIconTheme.ActiveText; } App.Settings.OpenMostRecentDB = chkReopenDB.Active; App.Settings.ShowItemInfo = chkShowItemInfo.Active; App.Settings.ShowThumbsInItemLists = chkShowThumbs.Active; App.Settings.ShowHiddenItems = chkShowHiddenFiles.Active; /* * scanner settings */ string scannerDevice = string.Empty; if (cmbScannerDevice.Active > 0) { TreeIter iter; cmbScannerDevice.GetActiveIter(out iter); scannerDevice = (string)cmbScannerDevice.Model.GetValue(iter, 1); } App.Settings.ScannerDevice = scannerDevice; // App.Settings.ScannerBufferSize = (int)scaleBufferSize.Value; App.Settings.ScannerGenerateThumbnails = chkGenerateThumbnails.Active; App.Settings.ScannerExtractMetaData = chkExtractMetaData.Active; App.Settings.ScannerDiscardSymLinks = chkDiscardSymLinks.Active; App.Settings.ScannerComputeHashs = chkComputeHashs.Active; App.Settings.ScannerEnableMusicBrainz = chkMusicBrainz.Active; App.Settings.Save(); if (iconThemeChanged) MsgDialog.Show(this, MessageType.Info, ButtonsType.Ok, S._("Restart required"), string.Format(S._("You must restart {0} for icontheme changes to take effect."), App.Name)); } } // gui initialization public partial class Preferences : Base.WindowBase { private CheckButton chkReopenDB; private CheckButton chkShowItemInfo; private CheckButton chkShowThumbs; private CheckButton chkShowHiddenFiles; private ComboBox cmbIconTheme; private ComboBox cmbScannerDevice; // private HScale scaleBufferSize; private CheckButton chkGenerateThumbnails; private CheckButton chkExtractMetaData; private CheckButton chkDiscardSymLinks; private CheckButton chkComputeHashs; private CheckButton chkMusicBrainz; private Button btnReset; private Button btnClose; protected override void BuildGui() { base.BuildGui(); //general window settings SetModal(); this.DefaultWidth = 400; this.DefaultHeight = 400; this.Title = S._("Preferences"); this.Icon = this.RenderIcon(Basenji.Icons.Icon.Stock_Preferences, IconSize.Menu); // vbOuter VBox vbOuter = new VBox(); vbOuter.BorderWidth = 12; vbOuter.Spacing = 12; // notebook Notebook nb = new Notebook(); nb.CurrentPage = 0; AppendGeneralPage(nb); AppendScannerPage(nb); vbOuter.PackStart(nb, true, true, 0); // hbuttonbox HButtonBox bbox = new HButtonBox(); //bbox.Spacing = 6 // reset button btnReset = CreateCustomButton(RenderIcon(Icons.Icon.Stock_Clear, IconSize.Menu /* use small icons */), S._("_Load Defaults"), OnBtnResetClicked); bbox.PackStart(btnReset, false, false, 0); // close buton btnClose = CreateButton(Stock.Close, true, OnBtnCloseClicked); bbox.PackStart(btnClose, false, false, 0); vbOuter.PackStart(bbox, false, false, 0); this.Add(vbOuter); // event handlers cmbIconTheme.Changed += OnCmbIconThemeChanged; this.KeyPressEvent += OnWindowKeyPressEvent; this.DeleteEvent += OnDeleteEvent; ShowAll(); } private void AppendGeneralPage(Notebook nb) { Table tbl = CreateTable(5, 2); tbl.BorderWidth = 12; // label TblAttach(tbl, CreateLabel(S._("Icon theme:")), 0, 0); // combobox icon theme cmbIconTheme = ComboBox.NewText(); TblAttach(tbl, cmbIconTheme, 1, 0, AttachOptions.Expand | AttachOptions.Fill | AttachOptions.Shrink, AttachOptions.Fill); // reopen db checkbox chkReopenDB = new CheckButton(S._("Reopen most recent database on startup")); TblAttach(tbl, chkReopenDB, 0, 1, 2, 1); // show iteminfo checkbox chkShowItemInfo = new CheckButton(S._("Show iteminfo panel")); TblAttach(tbl, chkShowItemInfo, 0, 2, 2, 1); // show hidden files checkbox chkShowHiddenFiles = new CheckButton(S._("Show hidden files")); TblAttach(tbl, chkShowHiddenFiles, 0, 3, 2, 1); // show thumbs checkbox chkShowThumbs = new CheckButton(S._("Show thumbnails in the filebrowser")); TblAttach(tbl, chkShowThumbs, 0, 4, 2, 1); nb.AppendPage(tbl, new Label(S._("General"))); } private void AppendScannerPage(Notebook nb) { Table tbl = CreateTable(6, 2); tbl.BorderWidth = 12; // labels TblAttach(tbl, CreateLabel(S._("Don't prompt, always scan:")), 0, 0); // TblAttach(tbl, CreateLabel("Buffersize:"), 0, 1); // combobox scannerdevice cmbScannerDevice = new ComboBox(); TblAttach(tbl, cmbScannerDevice, 1, 0, AttachOptions.Expand | AttachOptions.Fill | AttachOptions.Shrink, AttachOptions.Fill); // // scale buffersize // scaleBufferSize = new HScale(null); // scaleBufferSize.Adjustment.Lower = 1; // scaleBufferSize.Adjustment.Upper = 100; // scaleBufferSize.Adjustment.PageIncrement = 10; // scaleBufferSize.Adjustment.StepIncrement = 1; // scaleBufferSize.DrawValue = true; // scaleBufferSize.Digits = 0; // // TblAttach(tbl, scaleBufferSize, 1, 1, AttachOptions.Expand | AttachOptions.Fill | AttachOptions.Shrink, AttachOptions.Fill); // checkbox generateThumbnails chkGenerateThumbnails = new CheckButton(S._("Generate Thumbnails")); TblAttach(tbl, chkGenerateThumbnails, 0, 1, 2, 1, AttachOptions.Fill, AttachOptions.Fill); // checkbox discardSymLinks chkExtractMetaData = new CheckButton(S._("Extract metadata")); TblAttach(tbl, chkExtractMetaData, 0, 2, 2, 1, AttachOptions.Fill, AttachOptions.Fill); // checkbox discardSymLinks chkDiscardSymLinks = new CheckButton(S._("Discard symbolic links")); TblAttach(tbl, chkDiscardSymLinks, 0, 3, 2, 1, AttachOptions.Fill, AttachOptions.Fill); // checkbox computeHashs chkComputeHashs = new CheckButton(S._("Compute hashcodes for files (slow!)")); TblAttach(tbl, chkComputeHashs, 0, 4, 2, 1, AttachOptions.Fill, AttachOptions.Fill); // checkbox musicbrainz chkMusicBrainz = new CheckButton(S._("Fetch audio cd metadata from MusicBrainz.org")); TblAttach(tbl, chkMusicBrainz, 0, 5, 2, 1, AttachOptions.Fill, AttachOptions.Fill); nb.AppendPage(tbl, new Label(S._("Scanner"))); } } } Basenji/images/0000775000175000017500000000000012067326706013565 5ustar patrickpatrickBasenji/images/basenji.ico0000664000175000017500000021316112067326706015700 0ustar patrickpatrick sF00 %  a h PNG  IHDR\rf:IDATx}U7^ $w) .kE!(Ų(*M@%Bz彼ޝߙ3s{ 䃛oܹ3gw":Dk)p/z $I U7vql?-Q%Ѯ!xS1ؓkbQojvtzU_k9sne^Qtr/YtңC:)?M\uY4~x :ᵓ@lkjjlvh֭jhh(u8>Zcc7@!HMny(ǫoKcǎTBWKK^/VUȻ^h۶me˖󩾾_۫7u!؏Jz;& ! /P3~gF#y~={j@TXd ͛7Ok-9Ԯ8f|ӟ޻v!|%R՟>餓Nu) :{`@,X@% vmht1}6?Ws;0KsGl.;VЧO"f͢ 6V^U }}O}H/P@_Tex!**oo5[i&ZEmj_Sk[cjn+RSK*q*ԫ@5VUN=ih:o5 PCC^<ٵ)@m)v|M=! uJ`b[tW< IfYXBs[+jizmostD5e4ix/47=ԍ ;&1@$!~,5N|K_Z[o CIIjD{ώ?x:3Kϐc ϱΨ'4{vziV7GMt>tJsZ+/  gΜ97CqW~/՛>E+z{W\sT~xaw5t}e&zT۸{R2N:1i;OL >e͚54s=*%ӆvI+_`y`z K/UQdWL`/iz;^̟'L+?~.eYz֔QԹUJ@8*BEmRV=jQܣA :;WbB0zu8s"vZꫯj@/['|gAN`<0H*Hu^{mFƍ;ӛϮ;:W+F;_ UN{T=6D E-T(ߚ*Wy7miMͭv$AaT !R-9 GBd,InT wp=H|O#G6-8:{/kJGʔڷ+=+ݓ NO?@3blIʪ6ehK֬6bG(͠d@*t^W)"hsΥ~;jՑ>ӄa@Wߗ_~Yn^$i|TgHe<0Xi YJ#Ok\@7dc8v8>O.CA1;;7Ξȭenޗؿ48Y-] ڨM1Zf WZAzG׾l Y@YSN_z:|4@XT&p>Sn.M@{9^MϩS\uOu]mIFͣۚ˵ܓ;aTUd3bPO>L@|%A ܱ>T6elZGs~$ki挺3Wic#}jh~!3 ?IG )>Ki/8t@(Q5x@hQI0c>q:gJnD PFSp4gy&Pn\2lΎU#<.DD9k8Z7M/='! K GQCz[ NGx3 !!sZ@Iiku[t o^ά57F$}|(! @u!I7e \q!H1>jQr<<~8 Σ?a*邓+Ύ> O?zv3R_K'x6H$S)ٳXAi@$P<\׬^K@5@`s]V#ecK QNB"IxFXS)xd9RTz{fWgɺ._ u`cAI|聟shKۯW ]ppeO*{є>(e'{,$3O8qߵ߳'M5w[xmфu;'}sEnz<_'`)s𩧞 067 _]H{5&rLULؓO?בӶtvkl;~/H~7yDre6$|mkK7kZ͏ Ld XKJ>Ov|_] O80Bx{@sεHwiܸq9j̣? tKNO0fI} 6qwufhss$ ~>%646-mڒZe.>C}͂ [j'|2tDUyWz}~XgPԩS GjQseeMNB [[Ps)OTIo G{~o3 =`'PHWCx}:6k#RM[y3@t $hld ~Z%jP3'o؝ow ̘1*콐Ф l$_G:YeG?[ >!1L5F {rTt0AwP* 9ru_ӈ%}#rbe(!`huعJpTwt* yɭR!{1%5pI aFG'qH;&UCP헦<&0'' 0 7R?2D¼rǟKhުyWƿݫ?z R.3s X{9'䋷~;= :@'SwLc$&L>S @""a?8%AklIzE(UC'54u ^#yQ -VG^~FBIbzD( "D|keo2dﴣg99 gi ɨF*͛e^%EʳXIzIgq'G]Hk?Y:ńy4b8Μ2*,q<^@@&п1iI}HHqH^H'|ٴO |>BDAS2o|_wx ;3 {^ԷC}Ym 6"/~6c3mϡAٝA3 8{gB<(KcrJYY??_h7)ֺ箴Gm?|7t1Y4iL?IaX/$~nI``=dp,ra@Rv~,ݹ BLD#ќח{z݁`Q&-_^uoM3t:~^\{'t֗r:_ҹK'N /͇ަ|L+M*d~UO/}B/D;JJ2?QW@DMoϘUH;&&{O4oVj+9 ,ٴ%^QAe|`0o ^Ao(-XPmv^}Ύ>0, A Yb,@H+E$hFߴv/Gzdy9/\yg ?{\beL mi+҂UGtA.jp] 8z A Zq뭷:<^>wiqI}v^o,O rU<~e;7eZ}_|) {\pG3(pB# >(׷M Z::}B+-1~Y9G0ʺwon[<˿/9`[O\rl}HuHR7Y_r%4boT?yz_Cz3~_egR`U%B|c _.]lD9s ra-uG +0#L[ͷ7o>~#Sh`O0>pM J̀/AD*>aQĞp ޓs۲-bԸu/#L}uV׾iGА݅i)t1u1DC#G.' okF U+S[{ W3rQEa~^MǰL0~^>G:/ئ =`Nxyv~޾/ZN۶9Ihڴi^N9y{M]uh+ŵ nLǒa?ĢC$oe9hjMH/'xр[iɺZ+cᵔG+Knt4C! @`EFAyfG#/L̘1r5Q]xЄ3TyC凇Wzu;H|_xGqk!yͫV;z:_-7ߓ$gp* $h"wJf6x-1w .BǢ p۸66%"?(5W?[yD:v︅8pWC0,|˭]:Hh0?p#&J~@yG664Ѽyg(?\fE 9U|:} ~8w9?i9P.bQG<Gs;pEDF}!A`⵵:'"{Ă;1ُX# 3@F8[?lǠ*3F:Hh#6fM(mH3.dzv,әj? [h*Sp{$Ч ]M<"/MW0|6ճ?VC;ܗd8I@*S%dI ҽX8m?bP7Y ϛKҬY+[P` xf >ёo%x+=>A# Ml4yL:vǵޗ3q?yI?RK@cu=$nB#L=!a0HA>A-^ daPG9aq4_5˜o IR7` /,zuY6wV%։Yx LDs.W_"~'gu>3}p ͞i!ԣ1>3zqE$$d?KpϗQt@ݹ eb|…f#~)K%hu%y/2>IXK'$Af ]=hmm}D%`Աj^͙NK:|l n>}I =۵+p,nfsR炎t/S>L8؁kow;?@FHNo(XGcg8`v'>]EG7[ꚵ0uDF&v~ hf]0u0}1;ϰQ^wGu^{mvY+0`g`3#y۸IDhD׹hVz%rR2áɄ vYb͜L:n3?J`3fD!s0?bXo1~׺ ~I`~1 H `G5 zr4DXޘXH(Ykg8{dR3p&]pωn!@ 0lo_<ǏCG ?[ep9?;^}(%殻 _Bл殼ϰ6</?퓪&KPcnt T޾sF 8~a} AonN0/?܏{aD&EaPN&O.?Oȫ~"psms"@:+ bS@5"{9I}4;r(BGoS0 Pk"p >5hP\u/-X,2',L5brp>?^C'3FSz_8bYm:(+#PӓxfP1.._hONn1kF"5 QF͹t)~G H;~a/#4noӋL啕B1S0>gH9J;y9_J/9{x@ w͚5ϳ/r3*/'2qnO8tAf;etG ~!rΨ!ڍmC~rj&8@eTP k77(8X҈ Dɚe!|23>q)[04',&=bz St+QH}o^SpK/Y!s-Y/./I~ho +@S ;1 >z3A =SFJsH2:y 4>Q u?0CYg%v5'*3L yMFv4) nKp3t\yL(_\LKָP0$AЄ8X1H {:@h_&Si]{D$h@/3@ ƞ7Iqz 8ct@O3HWFj~Oð!?$E@& 3.1^T򐘳rCcQ,9!V@}7!_]Ff-SF_ 0 _~Y"4tZbvOSt>׫>CݨQrvGxg,gz;(z{Ph   ?<2wQЭO!'s0S<8ؒd](+xcXxB» k_XAo.vy롗 IVZ͉11-X@ H*LQ_y?_F(AuE sRw"gq\ @hv?D# @th`D |ҨԳڥ?"1( {n$> Ky-t3w!u|7v'b h}xZ8K{/m C9.!@%A 5xbAXtf1|8wCVp?1\ܫ`BYgh5ŕݸq=ؘvB b?L=2 N@~A,=B}? }t_+1%ear YxNKb>8=  305uq-bޅN@h||8g:b0ҋPk6܆|U*(7܏:+!?naJ/Y4FpWL4?, ͨM@h >>2YFCdՀYVpא g(sܻCp/. C>u';Ƌ ɽB-t溶nCVӿ2ջ7@ZX^. UWLןc?QHz#>A{?.^5G %2+ ct*1;xmSG"PtW>4"3x؀ [](Pj Q Dֵq*ѡYs-Z@ј #q=Acҗ7ܓ6(tCS1"$di?=f4ϴF{mdLY_3wAeݱ^saR I@g|}=qnUG =oõ$"ﴩ6z ?2grtHG_g4X$oިhz7[GP#)hs,Mc!K} {~BZUm~F*W_V8aoe~@xTeN@Rȉ]P^Q.Jc6lF "ޘ : ݗihRG 쉹d8ϖӋ/hۅ&}4qzƢզx 7)~%GG4|:Uk6P)}ȝRhmm:&uwV~[3w]tp߻Ǝx3iR5@G, S ~&os'}aXƵxT)&K}H{ L09 Yu\!?ήw"Aq1YxC-ڀS騉ptaAt!W뮯~B{ Em#܏No%!Vnw2&0\泹s穇B|^xN s->YzGc H|ܰԭ—@@k-Iˋ1$)_3I>K= mmF@500jp2I?sZ-@D &r}-= Qw7.b ij94YD?ehyw(G/V4|u`Ak͐_d,|{zц ATxh!ՒܓN2X oF=a# eAxTO*qĸnX6r$(U6i'{#Ē޾uP ;1Hdcg$z `x#yr{ݫG=E b-逸>Ss.E)^{M?U<_,.kj)DK-B *ln˳O{l ڶͭDX UEW +Qẁ':Էiw yqΉ00#o ʪJ;`jhls'QǶfz㹏XʳaB9]O6ۨB_YJJcG;J@ GYk!*q)Oޤ}LMAׅds@Xt?t1Kui:Wԃ>hmHć(t.Z[O_C~(H[h^:i OiimD

l 7r嚩]]Wb B]i;p@os,@}hsӕ'݀07QZo>tEz܃s|~@kCa+ަ=m~N` l%[md=.?zZ\+[Cb\<#Ҷf ޹HG; HXs1dGB4ԫZcL-6ff),lx_63ؖgvBÁqk]3MiPߏgj%8e;^yZzu:5r$~)`h($镆"lX0QqW򕙴i;X14T  7h 0^W<xx ҶsγMA -ÚzmCziޛir1g( _D=p%H:`vaAT;#\3 A&&BΣhvYJ |3!}19E R^$A/ﳰO䧔;bRM!Y}810!~j@W9ZL$+S*ҿ X&a̍CDd? jѠ j `h{M;#h:< 2y3]yL'GoY0<3u%{PYZ{Z!5)?Yi/>\Io47>%Y8an;,*$EwW'8ݦ4dn?ONxQtCGn|8 O>3?G9=^{v'|QmG 2Ab]wl3| (Zj^eiرڏ ;a ӧlɡӹSB`|N(u^ SڇUV\G?$n{=9ǡ>T-JkSViÌ>=zЌ,6ǿݍX_aBvdj H.>S+ҳ\>̖O_BCKK z._0%tP)ΉҤ"iR0=#:ZpŴhYkz !oFO3q׮2(\35gKwG 5B3ϯ&!UgTJTdM\.@鶺\I2mZ*GuXHUkܻ(KUfBzۊ x"Dy24LAi$%L Gߤ-yt(_}?x: ڴyMǤ7C.(9 3kVe~Y}52G3$mL7H*ǎ@=Y-w{. Q2d#N_vl&@%R D&tPT׷0s Ei_,Όn9+3L@"& @`fsI}겱td?/ ͛; )x]5}: 4Cib ΋OZh3e]N?^% ?A[<#uW~|3 ODډ>hP9o5d C遾a-ٔڗpx^3kߕ;'QwYC|'LF@k f4sÍi$x.0q>8Y0pN~,"C,%k]W2O~w'Puo# }>(~-c.xz 0'zIOe@W=sSNձI,1ȻSgY2H!f5N@81qT0)ondo~4^>$9:JgOzZ(T7$E-#6`N@!rM[Ys~z7@NGoBD`?zbu$^/ EqIY0騉tj<@`6/- ]^ĴGXGïL;Gx-|ձj@BJ!v~u\ݪi(u$;艳S$@.398e&@Ih˼%9~ٶ2\G3 &_jjI@Ox~nʙbo}tJ=s (:X]f@ !B(Čt;a~L/>D0m ggy>X`ذaچ p~(r@ǏOctFZb1&ю;J4R@zB݈3N\z3߂,mxU ߾l 9=MI9Io[e8g4Go \`$Pmk>2 ^FW5oE'FyS{h'*f RQ'yOLXeCvr`QM} iD"G:AN1wq*W@BKbybO izgi  \ gpc4gdqyԒtvvbueawq&KNj+W7- voPs&\ z? >ʇ-ȠMx2\/>r>@hK1 3@g.2οvj-lWbmH 40ûʪr7p8q8c,T@ ĴE y2;j8gf3 s.Pj."IǍKw\7X#+5H%.E4{l8^GI|@^@dC&'p]w}2|_p?1P ,vYL@ꇎB4k ?i$?~PBor3ߛMjr07\$Ddu R/0dBYO3M1x3Ir "دo4o&\~Ldzpagu^ YmH}Ħ1=lGQ)vAsk_vM"MpL(͍۩k-cmj봮;]U~07tͭwbGT >-X)UWW׬]^ &N ꢭt4{Uҹ vY} 322#P ` Ԏ# dOdۛc0=/X^ӧÎ 4&!'4o`t /Fa=S4s7+`PV0~t2Vh f 86h'#~ND"!~*,]!,DPǶiW5/(5.roAp|oF3To%^p-1/k~pG*JԻIx9眣Sׯth~оtƤiOn~\Ⱦ*ntb8IY\뉋zlv}q`0{fDe `N[τ1 53k㣨iۛz7w=)$8+?K04sL]̏E^DƦ+Ő9`sJ6;@?) iƌC߼P"Ks~3М 8\SWWKo//o]G>Bap}s;9`HҸzcMa6`2RR/K_&* v ݱ RWbz#+:^6fBY㤝t^r1'!S0pN@ةz{d?H!0?gњZz$^D_L/R`??Z `_km5"ΞON}#tY+i4D,̀'04^m~&>e ;R^gߛ*A ."1BVAtc":`@`VC%ʚ5k2~sED@SFzDD?h@,ؑ这bvD$4U:οrEKhB6~v}: ThS4_Q8cWm߽Tty#jt=^`~_2vbio{W&@!~ιA! n2 `p{oڃ+SA{{#_z9wv?\,d>gUv[gt =tٴZq [mQ7P>46:#{3ش^[`&r|F//YC-@Jxs's@h|<Ґ![ۊVnm_?XքenxLr`PIb z<1|2g˯1??0 ou f"4XwJ/Sf#i@1?DjX4?!!'_'xBI0l|I*֩S~opZ$\`=bp<%3Mԕu801IAt_]I]s3(s\^\fwԽ{M.iY 9ymltI둀P k6^ZFͭ~imW4DFu#4s^ЦR(<^p hpeeXa ' ]asGxo;wB;sj^ wȑl3525s2 ۦ։hQw|[ڂmrrС4bڴ4 HF@>ryy%jQnjCG 8:q8uQPFZZcݺ[I+NC(Ò题0* Q]SEUՔΙ'"inC~wc(#9y(5HM-֮U)Vl^]NA/D0_c{曞?SOZn%'|m֨ש`z aGynݩ{-asLJ,u{q^-E5 MzEf]k[{n" L<91 O: Z;^'o@km",Z#O @8&\V.;/1cf ɓ'1v?w?㉒xYyaO/Z "xe[iFҬsk<B`~@B 3+_ $;i\/# \(]V4.2VsFO8s g@ l}NX=CD@ԣoj5~s8'K=.FL L|Rw:w2jRHahLNxCM6<$)ġeԷYi0ẤP ULU4%$nWVB\Ś/%m)n% UqDP%betC; IH<@ݎͤQ|/F_b\Y+bR9K%UUao%S*v2/*uB,*I+Hp}A,O>?r[EM7+zΧ['ڀv $#eB{ӱ0?rNkA^}5+Mj$.(NSI@ 4+kuj1PGAPFCgo8뱟!fWB30ĜPij"(כ wGs{V)`ܠ <&EiR=1˵coNyN#I V  2Ǘsƫs QÇ̬*k!>$i.I!\,+o^wRYKykH 􁒐^/…}Ց1H>N=0K'c+SXHzzcVUOCUݳupx>#0:1=!L;~] 1:L! l" @B\z͛Rv<%Mu ԏCox-ӧOe0ն]RIhwNʜK?X$^XP.۷ך )EU(Җ{R I6ezjFџ{ˎK*++4 1cRS^(A *hljh.R; ((/kX}j1kjӦJ_P#qsCt}=Y$CMsGEUC416i[h_4< w| qч?tBd' y\$-Iɻd>'ifFsŃ7}+܏?-%A؞+ƈe᧌.z q|EH21YҊ V*Ż&n!Ƅ [B (^aڰ~ڀڲBK>_>d}vۨ% e!^XUIm3Y _ ^.qB^|q_<ŃhP`ƌשP ӟꇯ) p~Ha.~ qN{d@jrdH#;27/$N"m7M6]0FFz\Psk2k2!;FiDD xBR2 PE97/ѝ:yq=zT/ׯ,(@&@ߗm#+}DN8Я O#a2oo5ifڴ#7' |X5ǀA k+xP_wd4k~<s[|4nfp`&nz>r4qDQ efRXLMui÷[0M?x[t|{ט'l?Kow,2??FɝgjkrA#d~iFXb@ T_Ur3ՐT4ּPazmDϽWAg(jPS]rs7ճzS5uMjbj`_hTѰp-ZƖZڮl.~엝0.64 WE<%- )3V a -[Xpa+u]Gg~zG`EyqŇ?L]LPxZj7o0S ߅?sFsԇZy Z[H`8`~]@V^N#':vg^_]h[cĈ6-j꟧R]%I)I3uJoZfy"?/YOH@>o03 @$hb8UA_pҜ 9.&RgAi0?gV{Ň-Lrat.&L`.1A0)B*sg%~/²{-[McM6 | OwS ɒv謯N۶e|2e7i!`zFB)N/LL@ ٫4O5u<7wD`䥴!0%1ĸ!AP1f]\\┎?GEwH(oLc KҭӮNdJEqS|l:}f ,&fP~b`K5>9F2etcĨ2'~L1B )]7&ڰ)k  LfIvh{}+YQo׆ݗ##zk:NA\)΄{8L9s@&*_KC ߈T!i1+>8/À |pu B4x}L YD:Qv4\K/ X` f)͘1*5xy_R7|Fv(+_6qObҀQ4E$m&CV7IЌD8 ]TiU&d]- LLw:d<@@6a[HiDni^P1XU]IҥKuTXk=HiIr$mک(xg̯rgm%uF5t2ЉY%8wݪlb{1Utn}i*@dnUNpʫ8vg]09(>WM>/J RSUeu b .JK"?گ}W)~N r'@ >3[%FҲ@joߜɴ269k eF8 O766ik`U hp[x]mV*6kj3@=7\=$aw̸ fIg> -KK&,=G=6FLcA@aJ A`H/ɿVϱ"PSc5Yn+jsu CFg, ?/7K[k@= `%m1ҟLH\}exbF-`0@&N'¿ +#Eba!ʍ05P'Ҫvo|&Y`uCnZ(T+DQL}²^pJcPhAʃ` t8vgxx8L(8A $ߏ>7!C߮e|?!1u]gxSm&}hu ?0r`xgE#δ_s6b:oB#]Υ!rqw1=Jի(mҩ;i9D|'^|b_KE@S H7^n?J5܇NnL0B 5voЍ?K<`T0w=ihzzGcLY Ȧ q윆8~Dn:9\aB@ Ø}f0a UTVdƒկIN w9r|V]$M?|m$$#8bk43iڝVtzIlVIbcH<w풏$iĖv:@ X#M]Afn޲Y~ڸi%.R{TҨ+@@S ÖY s$!x>bdݺQcQOSez9it}\'@3@ @˂ Dox3׋@#_vf SNKzK=6\2=Ip`<|0ɈVjG^F^*ӕ%j][:+2mtqi]"MI T =Ztm٪FFu&1nR?&|R %lӎ̃KH}F! [VUu#FLkIxu4󕧼c7|6p BvJ$347W\sD*Y# 7}t^o[MK/՞<@g̯'Oq,?ISq8G,#f~;]e\7b:ҐvOk )TV>i 0;goM<)sBfXAVU!Vl~:C}ҾU*HH$RAf0$BBg{k9sMʆs3{׼lJ[s.z\y啳, 3ֶDЎN~«V*qk.gW=dLڐ1?/Wƍ=-D\|A' $σd76"1Q (7~qe'?&0=L&'D4]\be^?,FLXrhWj,G}וg"3OM%`ٽ~gJ t3^#ݣv 5yJۯv^ؗ9V=?o{(UE4wEF>}`~0!XրHlAzmu@ .&# ‡Mϟt@ۡ2$BMBUv|x*Q;PJcL ۯrW3YBhHo aT~N_x Kφ,zNRP|{+ǀֹW!\H_JjOnonvNw+l}qqKg'FrE"5+9@%p8ёqeO . 9\2m^;’!$bG HHd*|Xv"貭D Hz? r/.*j~C#TOc'n1Ƅ.?7ӯ<81JPHV`>C*T!P݅y5฽T%4d ` DBy߉/p{?kqm,6 bL'3,ң_άY- fV3:.kϜϬyn:꒤``^$܄Uy PBUL7 eJ1 )̙3>Gߋ %6*knWrPtoe«jNU8 1ܖ J۷N^?r#}*W[rPN5 XlJ_sn[N{f'i&{̉ η3q{p"e4VȨtsks#a 1񳈏 cMIxtr Hmd7!z ҰlU(W;|Wj駋/&/@\Z$HL9R .܂, 9W h?/ak(|a{8y]۳L{* @)CC8g;y0$g}S>/_IQ'MXhwď}Y0w<7o>M5kWG ;VC+. \Z] ?_1Y'0x'UXq>\xMzB19 @UD:\(^R c $# 00'V9_@}}4{ r\*U.So:!Q׉":: Ja!OFJd@@ZO\!gݵ޼+?˓ /|җtT'gT<0b=\H/ϐ4gAk@@&LYV },#tP 乳Cӈm I΅( %< ? S8&͑8t:pS)?8̕Pf_R|ݣa_v(\@$uD(`Ua`ȹ&dHdsey5&'Cs]D廨4U I.;Sr8Nσ,Z0%XݮCnGHyƾs}^{- uߴ^X8!1{4P 6;)=?-1wVȫ@rIo+Klk3F q;nVZ q URҁ ,~.t*;pz^:AbQsg2b}+N18Id>F' q."#ܢCuё +O^tb., 0F(\QV ڰ|gSrw@"{Y}{Y$i͙3N$dc--HMUHO?.f k{WQ*vM%bg<@$Vmq(!ߨ^*ǭBu8L?<]/C HmP*5D2W8_m]e9EP;Oz\r%o|7w&LC6͟g94Gݍ ^jNy{'@lWԈK'oqi1K|nB  E $݄ܖL{]e-] ^qv$*?2F?:. Vv7 |3 Q"cDECUA,q.z m5 0<ӬpT5oT\tHkYK CI9 l&B}$ /ÿNbrQ%p̪#7HXu~,qjAjd7!vfb ld7iMvo_L~zƠ<ĉW,oNՉA?EX( _'҃r uN+T)л }͑b (DB"ަ.$76ڵ:p/#3Ϣ;3( >{>3'Rwװ׊!v&z<dJN݄ &d7f4HVL1F5{72p\?e/.M =֣0CAt.]U7$_. VRw=HʇqO>j6]%,hu~ 1ӜЛy]& $ zpG^xeKpع9^.{9먃]s}(vFޘamm7USFI%B]TTC < у>`pu߂6jbQM - MQ [vف0X#3w}^FH( p*lK@@-Xb_KQ? |x q˖02j@~wgoy?0UمlDˍ'E-B]n;[xvA[R1lNi*1/" -l< {MϘ=g GGsmۭG~^*2: q@͵jb'BX6/%wq+Οo$J9]MȒ@*C,9tқ0uq݄X1 jz6.{ҥKbB1.\y=7oL=sH_C~^QPqkG /gGB Q/TuqX1FHZ&T1CIgm9fiQQ]%(%ԯY/qOR ?erȁ0g4jrƿ3gL{hAj{[)B7jEan~;k( +-Ϙ9+(gA" [xN80g,*T2Ro@֢ oHE@ so, ¹{f8W)G~7..i@FUk`ՓX( hI|vv!h'݄7!3[trMD"{}hWԥO}R0n߭A&k_>SMD* hj;vlCJ2nd9%E3tϘ9ٳj'?qxj>h^va]{~]c?j9s0\JXgZ@tmºX0EpG{^m.JIg"P2y 3&|tMhT{JFLP]o &lM8Vmo1c JXI[銶K/^@ ZR&N$*$smK.HWÇ,: HZ`ENE,ݘ&=[F„m #])htqYIm'\xNZ2+gb8R9|dD~%)H7X"~^FLIMH։]y"Y{p\Hu^s{<;?N$J 8 uښ $A"Ǖq1ߦ~n?[o]8,7x'ތʃSqD_׮ }(}]2M̵i(,+<*q0 ☀ɇ1= (2 G4re[ ѣUi&oz~<ӰzjDdlMb?WYqg3.䒓 B4̙G7.'-00*yfN*nKSETsq`M]GN<$W $?.Fli10?|õh@ |M@'nNZa2.W|GPBW_MmKuRC'7{&N]w/Qm4Dw r*s1uA=22jA?*Y{qLܧB/Xb$JMkӞ&R {Y<|dݺuo?Q&r}HG}%}JGR+w_$0^ܾiX.8eX@tp @fXCP(U_X6Xjo` OO({+A$F Htښ }tp׾5铨{oN )ŏ}0GiHJe#םR=xXq(V%,c6@I7ohCVFD<ZgXҡn)[PG]2AUN96C>3V%Xm'ޠ;&q9{d)o3Öc{"v2epTyάh^V9v"w_/@xp\ohp 2rI=&+&S+eu&\`nJ́݋5hGJ*BMv?Ʌ % Q$%E5Vm*`G{#ѯ&]w!O*`ٺ}Gdhh'Yud3׊\K|XvL!Aq =~W4kFl9ju˩MMoO/%}z=xhIg !`@~`cpF3]^< |_w-+)=7D&lMخPhsJiOG?F!v #|Ɔ` #e›׌Ԓ!W3fI- ; ˊX2dJ0!R^n`٭K׿4Q?G pMsaUv@]t7hinЋpD@?uzϙgY?Bb$\*%3!|(PUTu$ <3g5E\khaqbTyPda~e#=0WA+~ڏ }GEdI EȗJzT&e=< !q[\YrޞFؼ&T bZ<˔F]H>c| aņd"׌$snkqZ5rZݭ,o ę$'#;".z)S0da~~p7U%UT?qпe8H(RC!_+nÒW}ɕk7EDDƻ8Rz{܄lt:\іp秮CS n Ç&Zɥ:!zfXbz-щ- vBYP˖mq@54]G!<'o MpøGW`K|F;jqM)9STUX7>Q~mu8dM!|[̃EYa?$ll ai6!) .CѮQ{+J:L lGV#nBvn;;QB/ $݂LY\=V%S0oPv^*B#*_@u]% # O*j0s7\XTmH,>26 NM!zC`d禥؟aآF*ҁyDx.VMOIr5ܚLu6Μ*#0"qBqтJGZp)qp 2MӧXTfmDb0j=K6[ ?"+|B6]:y8R $Ǐz*v%F S`!uN_2lnu-r3[f^Kby)&~7ӷ;+G y^PC1jV5G̃jఛd]BA* @[Tj.s|#sID&1VA{'K9&Cpu߂O=^쥉:=@ PrUIݦy%_vgD;__@JDowgRo%c$PVaw5lܸC<凘 4F04@_["~.N9N%ozOxnDŗq.4pdKsèANzT}ltM+'"`@ :gh5C14Ah,J]l(+yL t$vXS8~4.a^yp9N-5Du~;ȣkP#k @D_M}f % nB#0|_NߊzSQ ]dD/C7Fâ@p & &XБ L5꽹7r($ưǡ,+8@R~JB>ZP[40Y$]y+ܹ얒#Ѹ97PJhΠM4^ImVŘgip_go2gUa!Oj%`He%* YW4ƽA (!qw@P`ysgRre Tskɢ}=]ԑ\Dy^ %qFO! #d3@HAFC\ Nd}_rPgqeВrMq2S#''螊W䉆 W>̻2qݑ*' H*O٨=~7?TsnFc?|U?+ɲ|ͧ*phw }A'\`cDr ** n7"ۣţPCR u'ƾk1ބ@qDaꪳ6>؞ Wn ؽZրe9BP 93`7^v @:aE*O?8{,D)BAT$iğ]q'X@ ͝=x.w{wqp :Ji]4Z`N u_uQ֊mdlh$xr (,?d0TC7,S0"k:o7$-`Xww:#(-G,WA9tA-tEtlBuD}x/]r" A^se^0VQkΏr)A%j $3p5߀m[390R@OUtp4|L=JzMm_ހ hכ=paPwY KUX|P9y)Nnbu, זFyu, D< \Y@SZ ͜Az rD*JMi*C3VK$dJ2!IfX1x>"1R`ܑ>@s s D/~\B !E;R)2u< ; #W_k-'%4a?Pw. { Z 1 [IjXr"*Gzj%͡JFDHX1Zf9r[)9{av`xSA [VyHzjW $Spڃ>'(h[EiKZEZ5 FpAD'_d>$v9jزy3uaK2 wBJw6#Qsz}E+ǩB $w= +0$ SK 0"QzS'KY\6P_@+<ز17+Y+D"tbuw_ կ߫0 ]u|!qTFAx߬#IMhpպ&R sz]6!H*5e4wVp|8nJ30^ID1ݗXd`| . I.Bl5rw!N);)c`8SQ^LH py<)(\T`r&>!& cU@4FJv:{o~_OQ ymҶ;+&>XX9h("7H@1lYo1)a3XE$5s]h#̼a9C62J @J0lwP"^rTP?G|~mC'K>/VDrQ_/u-5q0熈jߤ"ijI-r/E8~9Pb;xÎ10qPK<AAb垃 HRÛi6ЃPHTw-zAXj0C024@|hD%}Tt^ӟ|?k?m?u2vW OMGA ]\n~Ԓu7$*, Z2H* %3XNe zeoS|7Y J߉!\ ?C\e :*QWbVh4xm"%RwjQX'5g{0Թ<  gv>& QҥQK>v(ƛgPU Hj0)@U( j@gB9wE_|dW։|,W2W˥#_ߪ I8Jf7Utzz|h.sm|H"PNA tp`By< jAe.(T&Q|@֟#Y|hG{#)ٳxf~Hs}aEahsL ͓7x㨫`)>J 1jB.DBKG+p -8|:`9F{PxI%+ ( ZĊcp`6BPe Hg0ny<}~}(1*:DŽLA9(8pO*ҫ Do ޞS4pN*2U`ۉV+cz#F%e{EK+:j4yZ<1(~XU׿+1o"t;ep $X/N[湺~ p% 'P|4# @\ؐJ*+*x @I}vm݀`H(w}xzL&VL [wPVZp`~GU@܀OኃsU}<^k X,c+>$QJk,5 ~vϨi >n&xo xTb'c*%|S ȇSPC "\Kmg"qRB7,リ@شCCd(s^vF(kyTI,7U* ݀lpu@F~79 @iI@q5I(S*N"Zxtqh1&7Nh`0ݗF~c{I#_ڧPWr>$"Ob8Tb*(״&<'yZA+R(aDty @z(i‘v!pDz]S@擊&gZe]q̅GW Arg+3<@ H 90Aj =eUOr}g;S 8t IEBJ1o:ljn\Qȱ i¢2&DOZit~jEAȽe9seM]9o#\q6-NsrQ.+e5+PXE1MJb?Dϫb%Q3R2Xc0j 0޵h|ʣ)[> !$j_.o9wgA^"y '&`0qu8"_Es7gjC'k(LhY܊QΩ^< 05}7рƷƉEqވ|Lr\.¾ A 4˸ӏb~)$df?yQ4`wjq@(٧(Ŗt`Z3&Dicz*.3L?>oi©Nǔ/탠Dd-`_T$Qh>+N_W(}JRsyv4oӿJIoI"~}%K,@"OpyK}"A ;@PN+-J=\/KSaPP,6-:&|4V b9pk1Ωΰ϶HEP_[jĶz]B cҏ C? |$cř{zT $˨v Ty Ǟ^sT@%FPD1I6Jbo/EdW%( \| " Ä}2?o{JxI4uuwPv~Yh&S2zU wdI0 BSwl "̆?Gz8n!PG 2(3H-t=P(7.+.ʔ$.\rEQD0,ZWWVƚ0R 0,Y:J3Rm\$>#_0vbL #"vO6솋 p^ ?*]yW0 ry?iQU6^rw<n~ӑ?\Jpޚ5 .\> :=8 @Đx Z2Erܴi{=gWO&>{#?^qiNt;]R.Sj[ _ 2v>( i_:?xߟ'5IoDZ4q@9̅[;홤-]4%6c^oXnRr{`f&V;%mFv2 ;OWچ@ Qsɵk'kI@PΜV-@% Ъ#2z==>EA DQo g%\1R0+U"@p.xџRyp~?&>fqGJaǙ:3l#y8+W}G'K,mP.?mH' .M9"vU@ 1oyh]$@IM0 +v2 9`PC&O91>g|rۦ1![ L Sg"iԼd{ijAK=,C8wS^UQ n?t)'I]_׻֭[Ҏ¿1G oz*fOJ;%:+A1Ⱥ/uEXu|}pد 6񔋮VMm.N}-³΁@?+znR&cC 7=XXi#.H0pokY\66 CZHAJwͿ寨*$]dQԏ]8c_8g̩2}uC(]EI Td8Jq01[$uƁ۽jY$@~B")5z_vBrL+_4Pu-AVB ,'xV~,r`3K~K/)/jVwɧ'xߛKyGKRp؛".O/l"+V@Lr-)Qhpoaz*@E(.4KVj Y!D/ե"FD  }zM&KP/ Gy?%~1 gJϴ`Fz9p2{% mGd<@/ccܫ۶ï~ky}v⍟d/v=u>v\~#A7^vbXU#]"P]#PWtbq1]J\.Tj0?2lbSހr9K"K}%) Zl\k'P^cux_a_{bn0(_2 bk4 h `,rU$o%u?6 ٥cK.EQ^!uY)-qdIšc:[KJHA/1җ&0a2Jw~ހC&dEtnho;(5/<_!H!] Ǚ?h%XT,]G`ݺ=+O~\004cگo 8aUc6pgMh$ (zSRm:"`Bw Qq?LKpĄ2&ObW-"sae ByR,{UJ!V욆FNxyy #f;D8s}8jXf%x8y|PW&O7D*6K І@Y @`PDLL>O&:(Vɭc`;.HY ZWcc:p Ao튂1;0P1"bWyem*"sPȗyw{/A8GO Iˀa}{vA+v؛T}  ~s{W |BTP*) ^_t?&IcS' O0dG_Yn8*^{2wqa}`Ȅ&&8, B>ipJ݀ z!%~\%P!= : eJmkbi@nu,XCQC|z2{J_q@ozYǂX86(A D}<J|@{M5 Ro@Q$ΫiHo賈848)\/ŕxJ<ф2+A@sm)cʒRH2 !|j?|^_eHԄLIC"q,; >mbtU0:EߩOSO=% i͑ _Ŋ^`+ %x{=oۗZQqΚ9 >襐K)(4z5YDAA顪hz)5I&̢ـsg\*P+nAB?@I ܗć`Xko%jI@p܁v/yyb'_s̨(bٸa#<ȣrT^ve_>]Y's9gWw؇wjggTo>J N9G+i!%`q!jɃ9Z m| 0vaLZ Μx@dI _J3V=Dd/=!W! H-1x >}?ws?0]'~$Ó[FӽT_z揮mڴ^T *\BZ| ,VFr/+_Im]ڥh Dq*4e/r~FmF'u oi o[0 w]:g=O`b}[ڏ<>"kI1P3h&n{|>ob(Tpa&Gc# ~Hwqe˶Y7nTׄJğϞ=;Zo*G jJ  *XRlm() 7: CCJďSr2ⶴcU`Xih&T@"TTX,wI%,MTnܗAAYumaN_ X ('_W))HD}Sh`8m`6ZrY0``iFq|c7KR$1|۫*4/C^V;Xa: ݡ5k7W)aW-р`"ϴin>HOW7-pG1 "@8U$2oP_&PxK0-T ™~!Z3}2ABeHNf5<u~>-@TqSZ^ 6ݖ-[ꪫp]$&<_TBkW}ŞXٳwI߂ i0je?4Ez"ZBݿٔ,rQR;kU ǧ.7Jy)Ez*.n6"t>'>٦D Z'}ըkI^ǐ^>~c Ajňlڴ髖mB O&4D)%>L;sw_x% 6IU(Ibo\o!f@O@zg^ T"’O N^ L@|#-!{FeI-㱏ߴ$~4"EE۔r34z{G}Z) ÿ;{'Z6l}0fYn_:%)pvб͛|3f,Gtu{(9{jA SVoh!~lslYl DIe MArppŁLQ0Wy)gԩ[a7ұvoF]#wիW[M01BjޥR@0Nߩ-e?,XzNa :>XK;8ڈsdDLD} ,siphP $ 3= 3.@A4wJ =>vclmT#;%~4r?rշrVhȄ)%ZE>n^8!KػB2x0bw;-Zi; &2 fC̙(x…R"z<HT_O8m7  ^ (⯲DŽ#T>n>*P{f8IG|"M${LP:l(z)1^-] !~|}YX=$z$~&Foowu*z tXy;w{p`RO}CCC^^bfH' ]K`99}/^%u4v̜1CzEOM@<)KMUVm6pV@& [Ev]I(W `}qp$cDZjO͢uF^F?Q Ɯixla7n||I*-Ej}͛ꫯܾ}(GdJ @cw:&,=̙3|SuǓ/'tR(+ N*`#JNnao_m+t;ϭ3)'VAYJaCԑ0¦E(ɢtXK~$zו7UuyTNǝ Pxt Low޻-Z1+uuu6^w}o} ̙5GlB꡸9X"(6ѦXŘ @4v K5ĺ@d|c`HÖh "  E 5j/N= !~F={w~;x b딈wtGVTTEG<_q'_7z-:cuMUGe}*]"L9'$LXD ED.>q >2LcP`?\gY%o J!Ɯ+V<}z[lwݯlذa'L0w1'4`J qǜ쾴ٳ{=ϟ?| b'<4w\?~4xL VGwl Lb L"x>CrE41X5Б|tҜ#MejjvĠ?f Yt8}o_{C7Sif#klJ qOɹO??:#>m'|u\%>`8`ΆǓ aLA8HXR \kkݟߨbkP @/P{#£%ہޟ]]Ȥȋ=6lO<$e1 ʲIXtM=#smw]v'kj0U`C< |dΜ9Fr-{pb<(86  g3-@'ug~=eY "8ԅ="|}+9ݪsY>?۶mS'poAbիk~7_JEcn#pLw{G~Errs;1^Z ړ'lZVY*MAP:DD;G'@|/ 0?S&*q;ʳQ{@"o]G 6[?Y7mO֢i~l %Kcmꐠ: kn!~Z]?d@&xc=z:/\,eYuQOw{qTKj%dp nq?$ = ̷?B+bcO)@7!D!uUV-w>WT 7n΢p\_тVX]wB5U_"P)O|9srh.`޾^xQqa¬88\ʬ#PVFHbDim1Tj}q N7yr!om@be#k?( H+ZO [·ל+}6l n&Gl ]Nx׻W^oF@PwtNl=կj08Z%2PM D@aPhBd9E.;*:u,Lol ?&: %A=WZ\zpFDf۶mg?>ʄ@Z#ĈtWHSJZ:v2V5`d =}___}yz}qZ5I6<#`$ȠeeJoڅ P1JS(kGaRi (~2z,9~~=ZXkڵO|<]}i%|uҥ@5!wJXEŲ"ܗ ףmt@0ۏuvra{>M4Yҏ`ڌpkWr̘1i0w\  B%&R\ X"?KdbdùcNn5YW}Рg`QP˴b>qxC˗/1Cmb~v[CTDxǪ\`^{yэg5Zsg}C=?BI 9~xN\$(ҟUIi@c.CsWaQ"FĠgh{Kp4d?rnq {u@wg@v:X'ϝ; og}Ѹ hseD^J"O` $מ ҆v&pЪ.AY 2``D|H5h9^(w=\A5|3`"k@xncvghѢs{{{No;hz {8pсfϞ@Y׭RI@oӝva`0 BPU o\E>É́@}L9YpP"S- ^D̟-kJ0 VAb<;GoW!g#ǀr޵qƥ?O૖f< N%]s28Uauozӛ8Ϟ= zXU~cE"+nC; (1X`Z_tJoOE4 VKƀY#z6;  R"F``p caL>FEJbw;"xn)G蠣 +xׯ=%w[OUv޷պ߉b@J}~irxI3f8^eaxPo":5OL  r|e<} uMoEr{|-[tjB =x@յMˏEUF>hc ~̙3kzkcH4kھpKb ' x-C~t> +TO˦:= w2bx<ouQGʪ 6 Zb">wKƓ###˭H'y'*x]v}ղ K5huK61ֲ$UӲ>cΜ9Xia?+- Ss8m 4Vb yttt ,'#  #(-2...Nˑnll ;1+&   $*06eee@@@_4.("  '-9Ơccc1+%  $!!!6۽ÿuus("  !{{y  żuuu` mŽź!üļɽĺY4ɽǾʾ¸񀀀Ǽ»ȿpppyHHHOOOHHHFFF!»ûùkkkkkkJJJz»Ļƻż{{{GGGºĻĻ|yGGGιɸ؇񨴶ÿ»ûɿpnkIIIe-ϿƲŮʲɴ󀀀4už»ecbMMMUUUTȹı¬Ūͳ$uȾdcbKKKNNN iʵȲȯͳ§˾gggKKK@@@wʾȾd(w暚rrrvvvpoo'wǿc8~~~kkk'iŴŲðű᧧yyycccTĺbzOYqʵccc.̻xMyKݹVďasuǜfrFihhſ|yOvﵖ{DZ|˪|ѰٸԴ˩iyOuaĦ®Ĥظ׸շַշӴǢxNtttl|ƮYåŲǪƥæѵչԸֺչټܾͨY#zO¡ŧİĨ̲Լջּٿܿ۽qǯålãǭʵʯªưվվùķóۿغ{P_5|Sǥγƶ˿»ƾǾƻĸ³ۿھ`ĺ񀀀vJȨIJŹĶijۿڼĚuè^}Sʪó°ھڼʢzpTͮ;۾ڼٻ̣v#wL̮ٽٻٹƚuYӮyNʩͼٻٹطdͼէ|u˸عطصxM#~TѳۻطȝyokƱ޿ҮwL\ŒZtʷĮŢuJԀ/ZiϾƩksE˹5sGfţͳʹĪeyLﱂZZzĨYsEqDsEvJz·WIύ1iƉR"ja?????( @  )qoouћ壜𜗒ꖔ݉IIIB%,333Kִƿrrr0(!  $- 8LLLa1(  (!!!>vtt,#4441 333 U􀀀*¼Ƚͽû˿ú```UMMMzIIIT»ûYYYx{¸üŻιսþ}ZZZƴ«̵싋 Ⱦ¸}|{aaaUUUȴȲȱ!DRcccÀLs;ð¬XvYҶXhinƼ:µk𹜉ѯ׷аxƪ{z{Ro¤ƳǦʭԸչչؼ˦ɱnåĮԼսۿslͱ²ǻϻżĹ³Ӱç󀀀 ƭĜ{ʺͱڼrqäǤ۽ںr߀ȱŞ}­ٻٹsj̸ظΦȰvֻٷm"?㼼nʷŮq^nն˹Ȩb˹ũf]Y굆^龙|)PƋH޹﫫ˍw#???(  kkk&||@#eee]ý& :zǾPPP0III(Ļ䵵и䞛TʹƽK歬ĺϹū˳Uç̮նƦȰʫ̳͸øȮ+ʨ¦ۿɪؿֶõƼɮҸƦоhAAAAAAAAAAAAAAAABasenji/images/LED_On.png0000664000175000017500000000024512067326706015334 0ustar patrickpatrickPNG  IHDR f pHYs  tIME  UE.DIDATc?"MYn VөDi5@H-KIENDB`Basenji/images/themes/0000775000175000017500000000000012067326706015052 5ustar patrickpatrickBasenji/images/themes/Tango/0000775000175000017500000000000012067326706016122 5ustar patrickpatrickBasenji/images/themes/Tango/24/0000775000175000017500000000000012067326706016347 5ustar patrickpatrickBasenji/images/themes/Tango/24/dialog-error.png0000664000175000017500000000201412067326706021440 0ustar patrickpatrickPNG  IHDRw=bKGDC pHYs   vpAgxL5IDATH=hg)-aa)D-)RL2uбhBIHWgPdĉQS`ٕtý"Q>N}  , \[{Vkrp Gr9lf6^Ui `~;{<%xvPQTq")ݻ2|*_֫n>x"ÇH**6\"KW //]ʦבT"j4ySOry 1Hq5J Kw}-Cvn}z߷ל4̂p\ 6Ul 4auROS傦3gl5)hA2cI!LMladoh7`hmX~3\ pD4]6bs3Q]׮3EPӾb[,%x6e.k@tqṙh.0 yyKQ(%ښY<^QE(F 0FIEچ_7iaݽ3-qkAzhkxOYRM6s]1T~yvfõSmrk' ^4=M%tEXtcreate-date2009-03-30T22:53:46+00:00 ^lT%tEXtmodify-date2009-03-30T22:53:46+00:00`IENDB`Basenji/images/themes/Tango/24/clear.png0000664000175000017500000000256012067326706020146 0ustar patrickpatrickPNG  IHDRw=bKGDԂ pHYsHHFk> vpAgxLtIDATHǽmLeys̉ffSsڛ-7ȇt֗js8miQme3Vf"799yy>xt f]wk qI+e?Jׄ$$|kg݃(ӤEf_˟^tyVo2h/\`bRB,Q]RIږH +:C[z=dL/o]ϲUʹ/Zluؗoz((1l] ) =ESh{U]B Y]VZ ] SGnW+TM1jrۗe34^K6/u5 +P!JfOaqz)$eJM/TaWGw@$ H)Q4d8BƙzS]M1= Ir!e%Btqe\"z/GHjh>H #T:^1*8 H}' @rgprh9Xy=\f#2dAn޿tҴjFćuQB8nt;5xǺ i)'L.쉋d+ց%6hȚe jZگ{ĆɔHɺ:`V\zy2FJ.ߣ1SMEw՚՟ܐ D$2⏱iݥzoY;u7 DirZcxkoI`OoL'%tEXtcreate-date2009-03-30T22:53:45+00:00v%tEXtmodify-date2009-03-30T22:53:45+00:00NtEXtSoftwarewww.inkscape.org<IENDB`Basenji/images/themes/Tango/24/drive-harddisk.png0000664000175000017500000000135312067326706021757 0ustar patrickpatrickPNG  IHDRw=bKGDC pHYs oy vpAgxLIDATHMkAv36KؘT֐ZC~(Y| ză~("lIKB6&MK$mc0?/3 \aR-?v//Fc< {R^xDژmu]:Ak'\ץR-oMXd6Rʹn  q vݽOE `nr#iWV_G\&jy˲qRԅD0ʠp-}H)4mnb)%atM7oal2G `pDWV?@L&mۢjM8΃8#rQi Y(,,OgK4SRs\׍ƸQ*4M`^B4,BeYضij<.0躎R MaHC)E,;3i0Q 9CVSlVuntL&}KrPKB @4O{S~f΢(/Gܲ%8 ׌Ns)kW?-RJ^],yy)uG/s6%eKSqϫ׬IA @Jxw**nXϗaBbPwh(+K^S6V6ɘdُ:erT=: ka2!3KgE9rC&Ngr/2zo)/+FfL)ySr1M7p8Ym})kD7~C),,xfyvW-JgnOI/~[ySuM?Xr+%tEXtcreate-date2009-03-30T22:53:45+00:00v%tEXtmodify-date2009-03-30T22:53:45+00:00NIENDB`Basenji/images/themes/Tango/24/go_next.png0000664000175000017500000000204512067326706020521 0ustar patrickpatrickPNG  IHDRw=bKGDԂ pHYsHHFk> vpAgxL)IDATHMh\U&~IIb].,X3]DЊ+ FJ)ZBJA,hj)Y"DcpXER MGIcL'ɼbޔ f ]yϽ=sVdn5a(Fcc]d} `4os;uS)}ղ}ӣ_٨;^fE3ޭ~Ҷ%ku+زiՊ5O}7{?@rspXgEq,3SP_ZGцw?',iA\q \M3 ՄLD&  M@"2vkfgs˪[wƔ\-M23+s?t#B"bj9~ mwG2@)exܣV }IFeDX*q{]@lM*SԀZݫYΜX/i5{&}{&:SOxl^s !:W=$5?b,7O^x q >p|.0SC%xg?`Xb1FN~=|Nm2/|+l"BV+ UN9]HKLRJ3j &"X4IA#KSE΂QWraR{%E2K`Y,T}p>+baP6/:e+<{QnwTW`jΊ@E7|4yW^t4%N/3D|4Z@O7Wp΃E=je_9`ǹf=^KYz0_$bj9gG/ 9>? e^LY}ӯgZ5wffRt^~ώL2XLۜR9̩L5 !;~;k%tEXtcreate-date2009-03-30T22:53:56+00:00l%tEXtmodify-date2009-03-30T22:53:56+00:00EtEXtSoftwarewww.inkscape.org<IENDB`Basenji/images/themes/Tango/24/dialog-question.png0000664000175000017500000000203012067326706022154 0ustar patrickpatrickPNG  IHDRw=bKGDC pHYsHHFk>IDATHՕkhSgƟټlde7/]2ج uJ:l_16&e8?lҋҥU7\zikҦypN73^s>} W[j}a/K=g{**kEH_*Ng7n} Vphzj|@h" "^,ײYcɐ+M:?4ƅ?B8d@` bRHjw_,y-<\X vr٣o6#pY-H? _T*ȸR&qc L4~޼UosحG@+{xkn"=r镶 ["rKfrnѬxGImI=oh͍] / R*ZyjkG;iլ-{֗9/_]0;(NGw;ҮHWپQcx|r-] `}jȲ=]Ѧm].3y*Q|P)wJv*,O?J$AheIENDB`Basenji/images/themes/Tango/24/refresh.png0000664000175000017500000000234712067326706020521 0ustar patrickpatrickPNG  IHDRw=IDATxTkPTe(q2(.?RLɜ\-`,Kr 7EAb( 뮰0ht׏gΞ{|<VlUkZ,$~!RO!q#HIU:Xy#"Y}7Nu@>԰INj'grj-C0Bfnc[F!,\1:Qn"+R$ _H.Ys[ sN?7 BU^2BM 5 E̓y[D9?xB 7|)9*s_M-0˱˭ų %J )(BDP^%mÐW,E;peS T>NB73h|tdrz OwD'3ϑ+r=NEݷL\Ff DJK̑d.0H$[@8x`ʎ沣7 9wMrR6gs'DyOtg\Gxɕnd @$fѹgjK]&Y!ir8AM+@n!+CC1ݑ^517C&+:tB? l?Xjs>yW _Bqź-MP7` ah3a|d|UVt8r'c8BaCMI `zKZ4GF:4]nTc<|NvH3oFjO*JȽ%.Cg?C0l-Wo. *ŭsS`V{qNV "Ycs{ '~%Ek^%Xm@$O/=|ђRt-s7L)pRf1mV^mY:)&># @aE/86iBHNd:?j'g6ށE"t;zE3xiB, !<]1_>X`e:IENDB`Basenji/images/themes/Tango/24/quit.png0000664000175000017500000000231112067326706020034 0ustar patrickpatrickPNG  IHDRw=bKGDԂ pHYs oy vpAgxLIDATHǽk\UsΝs|8&ESiId.Z#H%XFl TĮ\E%]$-.h)S0+L|q\̇I:3trﹿs!^4Z+ 8+B B؁ /c(HRd\ H$/^sc) j5:zc L叐eѨ7_ ,\EkMaHEq ֚B)@*fxh <|<քaHXk;p]t:!ZtxK\5n{wrM7q\< W76 hϗ:Zk"kЮ&J\.Gc&g=^|)^Y[[ձQ/rh 0 "m0\@Z߿ǾY>4O.#HEF8}IERJwgI&=D#:*^}w_o-l6hfK.ZqlV+_O/Jb?=Z6aYy;h%tEXtcreate-date2009-03-30T22:53:46+00:00 ^lT%tEXtmodify-date2009-03-30T22:53:46+00:00`tEXtSoftwarewww.inkscape.org<IENDB`Basenji/images/themes/Tango/24/archive.png0000664000175000017500000000145012067326706020476 0ustar patrickpatrickPNG  IHDRw=bKGDC pHYs oy vpAgxLQIDATH픽kSQsGLڄƊꢎGAp ~LN8Q,R݄V:A-EC". M[/6msqmi4p=ylK <( u$Rj.`ռ( ,)8x6^;"֚_K2׽8ֶX4і M}op{ 7 &3Hƙ@iy23OBbS;?fr|4{='p}RS_0r_!-&>: i7k4UcUZD/9h+L3]I{ҀXˎp:ʙZihUUޕWُ8v*x0< @WS]z@"D֮#3;:Dpj: H#rx,b\W&&p7R}ZMpّ\c;~DJUyPXkCՌ!! m+@1+܄ dUf `kGhֆ|3X6X\*’~8lK-Y@ cP(Xj)þjot %tEXtcreate-date2009-03-30T22:53:54+00:00{k}%tEXtmodify-date2009-03-30T22:53:54+00:00$ IENDB`Basenji/images/themes/Tango/24/go_previous.png0000664000175000017500000000211012067326706021410 0ustar patrickpatrickPNG  IHDRw=bKGDԂ pHYsHHFk> vpAgxLLIDATHMh]E947b FDvFH RBMW0 nD*0TEEZZ&. bQ$I?{̸scM6e~͙In;w ! |;i^<7iS'R^͞ "۶l{C%]mRMxpbQܱ#w(=/ %tEXtcreate-date2009-03-30T22:53:45+00:00v%tEXtmodify-date2009-03-30T22:53:45+00:00NIENDB`Basenji/images/themes/Tango/24/video.png0000664000175000017500000000266112067326706020170 0ustar patrickpatrickPNG  IHDRw=bKGDC pHYs oy vpAgxLIDATHKlTUƿ󸏙{gL;mچNG603mPyDpƍ] Xע1F4B@\:aQ@@i:23>w낡и5I'˗C 8> !ܶm3!$mvo9ݿ8z^Jg]V##˴fNGs(2 Nо=N>MU;q$ٵk(B':x_IsѲ]^ش-yMRʶUmKOr_n޺Eq+(2e]7 98DuشH$ɩ &n r3DG |(Bu(B<EA c,'MOMDQj_}ҕjݑP#wq6NYذq=,4Mx0@mSrٜ4y E8z$@+aY1z7ada!40Э;4 I$I`Bu|no!2* j;Qb6,ӄ$J`2D"9[sAQ# m#-Gbé8A(qC$L݃,; Kaz_BXD!_U%KX:N0?i09abՠ%I:]ދX$H&nܸ7@ti< ",~N4cc1fG@WWǻ\IiV*.B@@za "p|ph{ Hm_}$ ÜsfPUc,kif1:õkאL&d"eعKXdfgg}]Iy(5 A@C, E,,dL$a&˛Q[S:\1͟/7n\58Jh$InȖe R4M.-B,I.RNͤ=۶m|Px<%hjO4zM^~q7%4MQJ9P&ry2 L!5)t])6<.TΑ ~Jr,/\Lf(II5*/_Wz@BE|f+v|"c}tt#?4.W/|*qT%tEXtcreate-date2009-03-30T22:53:54+00:00{k}%tEXtmodify-date2009-03-30T22:53:54+00:00$ IENDB`Basenji/images/themes/Tango/24/preferences.png0000664000175000017500000000123512067326706021357 0ustar patrickpatrickPNG  IHDRw=bKGDԂ pHYsHHFk> vpAgxLIDATH핱n"11;tA{<2];)uh yxtJ.Nq>wf4id3ے`>?vk@T7ZGQmE@'D^%xn={Dfv-ZѠd|;(T*( iŭ$t]W4|Dyp<x`Im 8 \\z772%tEXtcreate-date2009-03-30T22:53:51+00:00)SRD%tEXtmodify-date2009-03-30T22:53:51+00:00v$pIENDB`Basenji/images/themes/Tango/24/audio.png0000664000175000017500000000207512067326706020162 0ustar patrickpatrickPNG  IHDRw=bKGDԂ pHYs oy vpAgxLAIDATHkE?ϼ٬iiڢBPZ J=TD&x7A"E`Q$Q MQ&M;?n`cH<<333 oɿ-0?fh;I:S3zJ}d&PeZUMT+OT1Q@ATUt7GĨ^\-NQ.TX%MB.5|vg>zowgs {䮉 -bt$&$)J >i:LAp$KYkJv ǻ.>*-v=oqhP~|&h89M])Yx{|unBш`Px3Pb5 F>Ы!V͒pADCsBQĤCt$z$hNvR6sg< ]q8bOGc:~r%tEXtcreate-date2009-03-30T22:53:54+00:00{k}%tEXtmodify-date2009-03-30T22:53:54+00:00$ tEXtSoftwarewww.inkscape.org<IENDB`Basenji/images/themes/Tango/24/remove.png0000664000175000017500000000054312067326706020354 0ustar patrickpatrickPNG  IHDRw=bKGDC pHYs oy vpAgxLIDATHб @ $6fdƠe,2, AMPbt许2?ɍtB˗rp끦򭡿n.lHUN=Pi|}]\`&&ݬg QEb8^1{e%tEXtcreate-date2009-03-30T22:53:46+00:00 ^lT%tEXtmodify-date2009-03-30T22:53:46+00:00`IENDB`Basenji/images/themes/Tango/24/application.png0000664000175000017500000000220712067326706021361 0ustar patrickpatrickPNG  IHDRw=bKGDC pHYs oy vpAgxLIDATHՕoUƿ{gYϸq MIQi%Uwmy-O`[v!eūB"mTӭN{ؙ_3,2nMS#$$tu\_< @RtO,wx2>^>Eh++WK狭Ч^>G(Ǒw Dgl4fi ýqnv\S;Y2 ,Ъ* <փ6A dQT!@`2p&rTV!(!`5V2e#:+_-ދ}ˇ"vIJVUO#4X]+8L:ͅ]S>_svע9ǟ"`2 %tEXtcreate-date2009-03-30T22:53:54+00:00{k}%tEXtmodify-date2009-03-30T22:53:54+00:00$ IENDB`Basenji/images/themes/Tango/24/cancel.png0000664000175000017500000000255512067326706020311 0ustar patrickpatrickPNG  IHDRw=bKGDC pHYs   vpAgxLIDATHǽ[hTW}L&3$дV iӌRJ!З؀[(Ŗj1X/PPh"*"՚P-h1M3ę}vf2 -aoouK<1X{|cйM9 oGp-MMźJCY&f"o%.)8ۺcGq8XXVV\J/Zի|ljOǵ_TսuNgߏaƍDoŋd_dt2 zݚsMM81!@TT[-[`d&&G<P##8rB4;w8B!2##8W ?9y耫u۰v&{&# yq+v)J;owj`>1:dR{xt$UJVKggl' ^oӴեRƨϷ3dti\UUڕ+p{ leA<7֯/ϟ(->?AIr%tEXtcreate-date2009-03-30T22:53:46+00:00 ^lT%tEXtmodify-date2009-03-30T22:53:46+00:00`IENDB`Basenji/images/themes/Tango/24/edit.png0000664000175000017500000000176612067326706020014 0ustar patrickpatrickPNG  IHDRw=gAMA asRGB cHRMz&u0`:pQ<bKGDC pHYs @SMIDATHǵMle;.^ib 3]lC|2wޙ<$8F"`DUu̷'Pwg+&pirW;6#"u?OuBZa[7筵_){?I0磂Sy*ZZZDL&K6ůY^?ZW8p9InUGDjڀHXxR|ٻܾ=A֮5ݱY=;tFUC"&gw`Mk.Fz)"b+##W]lȮz/24MdIENDB`Basenji/images/themes/Tango/24/text.png0000664000175000017500000000117412067326706020044 0ustar patrickpatrickPNG  IHDRw=bKGDC pHYs oy vpAgxLIDATHՕߊPsWݽUPT4Jٍ!JaݵX`GAQ^ ҋ%^ԸgcvSЁC079;OFcU󋗙dx2RE^<UED#'9z+`zjf-nS*ݾEѝ7c J\.&#a:A@E SÐ~9( CDj{F܎iZzbMӈxǓSDb;"eC* v?"c^=dDZa\Rdf}qVz0 j&vLj܋8߼}}q /ߞ}p 0(p?YVk (Qnnn?1ιP|kᣕJew7,,,{Ef:i{T ^hYg_QF%tEXtcreate-date2009-03-30T22:53:45+00:00v%tEXtmodify-date2009-03-30T22:53:45+00:00NtEXtSoftwarewww.inkscape.org<IENDB`Basenji/images/themes/Tango/24/image.png0000664000175000017500000000200012067326706020127 0ustar patrickpatrickPNG  IHDRw=bKGDC pHYs oy vpAgxL)IDATHOhU?ofNf'4&PZZQDD ^]SAl\zb$jUu>ct  Tgr-~]+3^,dOcn#=?ʃRR4[1ͦP@NDXͫ<ġT&Ihovn@eu Itsl`.ހO 6 Μjh&$ oX'\>{ bTnQ"Zk1F{9KyFc|Z&gс ,K$]:M~ XONeE3]M6 /٣(@!ގ ]lHk@ٶFå078g{co@4gyEBŠj%tEXtcreate-date2009-03-30T22:53:54+00:00{k}%tEXtmodify-date2009-03-30T22:53:54+00:00$ IENDB`Basenji/images/themes/Tango/24/document.png0000664000175000017500000000137312067326706020677 0ustar patrickpatrickPNG  IHDRw=bKGDC pHYs oy vpAgxL$IDATHՔjSQzij)!Cq8R41*BuFb(ҋ820F1E`{b@p_q cܸv+4Y(͸Q(M͉0rL, ^? 9TjV(-b o<' @fbTH/dP*^H⮮$GPU:Nr * @'f ""|}s߮u I&tSۛVͷ'5e` CGTV}k6>ѧ C[ؑ "@ec1^MĘ=NA(@ĸNcdhcstAX]IJʪ ij5JOK-_4 ́NPkMY.ׁmʲ"䲗QZ1U("n";IEāNOHsssFyw?6Nʵ< s4Ǟ]1- 4[w\/6`t%tEXtcreate-date2009-03-30T22:53:54+00:00{k}%tEXtmodify-date2009-03-30T22:53:54+00:00$ IENDB`Basenji/images/themes/Tango/24/about.png0000664000175000017500000000162412067326706020172 0ustar patrickpatrickPNG  IHDRw=bKGD pHYs B(xtIME s!IDATHMh\U|ffbb&"hhFD4(JC v].\)VDpJk:qDMf23{>6&xιwVyBb}H)ecP.v/Lw=d~{0)En"ѷRܾy&`bN=EQ}gb_B}ِۺRn*cKf{ )g@ !9|KʢLJ*Dv2s5י,*PUFS=ha*D^DRhTW đݙ@I%%2>|֗>W[ NS$2&o߼LzKln}, a!L!J!,~[eRjē1 "4fsݫΜWDO*}H%@]2%[[sXd8bI3u dJ B2U$?rm4.{`AD?n"?$Nuv,fftkfHf @D4deБwfyglc5! WbbOףs2`LYA2 փRNFH+RFD( Е Na:ҥx@N&n.+^6B])g_qz*'3OPQ"/ EY%@}eHiqWlW,Fl< 0ΜeێCf\'ӡJOE#UCc|r4ִ-2ns'/-+{>ܝ5b{4NnE ;{KjkP\F[,HRnʩT]ӟUA%n!:z5lQJ BHIHR%Q׸ĤWfzNu>8{LS]N 1!fV+T9v^76ę*1ZkYΖFbI[ fGmƉ/@dU+tj/n״un1/e4\KLv:Yha2$ҩ03vt>[87rj! sZ2Om秂aUaW$wS晑p7F~0zM`^-1p)LG|?05FřАz3O6PX/?0= w@z^C?~fWٯΞ=R#U2FPHD#8Pӱl8ww?/}M_p3&-۸ąnZ\| z9LWhd7w,7<\6`Ӧgb*)Z[ȝss]`HCv(j9vb V?~WW#:<%C48w|ngp. eڥz{-:Lu]w1RJt *@M)d}}@,L`W n Sc#21OẶ%tEXtcreate-date2009-03-30T22:53:57+00:00Jg~%tEXtmodify-date2009-03-30T22:53:57+00:002JIENDB`Basenji/images/themes/Tango/24/close.png0000664000175000017500000000202512067326706020161 0ustar patrickpatrickPNG  IHDRw=bKGDC pHYsHHFk>IDATHOWx<LJ궴6]TU$2P,_M*D$U.*|EUc`{m>6񅫍[TU(ۢؗ3pZu4*!G&B۷nX't(02EN f?4HH.@0Q@/ǗE`FGb,|>' H`}c}ɲY>$I"ј/$dwoO@&!1 G0) |aSPCo+)A' @tr7+k_ 80N<(OI\V^DEosMӌfpppp`6˖:<9;u]DH&W=  q% UU[_矛i1 ~,3'˴CfX:AgUttdFZUs?t*WM2MS \V'p)5u@/y ftc;=!"iZCh -󵦎fٓz~>jF  r܎mv@{ude‘hng/6`NKEi!z³JR9@[sՙN%7ε@W h7.d|6zijG%?|RIENDB`Basenji/images/themes/Tango/24/drive-network.png0000664000175000017500000000210112067326706021647 0ustar patrickpatrickPNG  IHDRw=bKGDԂ pHYs oy vpAgxLEIDATHǵO$Uǿ006=(7k&1F78L'8p#\I$@lLH=h4`2,003^u!ZޫO}k6z706`yyg"z-ڸ`iiI*sPUtUU+Q:8::lmmu X\\jJZ cwweYxGUv}}9"B \bjj<>>1a"1"̙2gpfAHjg11}Hjf?85D`m,c3}02q> '0"~twW9ys:ϴ)/Ͼ@:TfF*nK7;xxҾJGb$323 3V@H!dYIF9Z*{/;rZ49$D0@mHsdݲY!G}g|G5*waf:E R0MiPA VIN頝'NNCiWtihR 'E:W&n"QZ!B -㆏~T^Qy\|p*VAƘ{゘;ka|p* Vr'(qT~_Yx\.dyc0$IOhooWiNyQS0??@Uț_0"rU}yȐ|)"&󾞞ΏjS%tEXtcreate-date2009-06-23T17:02:13+00:00U(%tEXtmodify-date2009-06-23T17:02:13+00:00 tEXtSoftwarewww.inkscape.org<IENDB`Basenji/images/themes/Tango/24/symbolic-link.png0000664000175000017500000000154112067326706021632 0ustar patrickpatrickPNG  IHDRw=bKGDC pHYs oy vpAgxLIDATHǵKTQ?kCRǶkDd4ПPAA-1h*DFA%অ-t܈3CI`iq{I;s?7'S#MrH{sιgwy295qWVma[m3K#)ƭё1Z-$*U?63+Ǚ}1sXp)@ep $$Sg H?zDQɋD>Կ@{"0 Ie${CRd X` p_hl6)9wv (e.W(APѨySsbii|\/I7Nπ4PXYѨp~;J K^󐋡HZH 1( '@pbȩ2BlT:NWN.bx)s\P8L>w]B\BV"3_D~mWEI5k^Ęa}Be)YRa.@DXz N6U^\^K^6,u wm3ڱDɺd@^X|sk.Eff%]? QM?p%j}!"p8 ;Ohg+`_X3 aܦ[g /VI%tEXtcreate-date2009-03-30T22:53:53+00:00Cm%tEXtmodify-date2009-03-30T22:53:53+00:00}5YIENDB`Basenji/images/themes/Tango/24/development.png0000664000175000017500000000265212067326706021404 0ustar patrickpatrickPNG  IHDRw=bKGDC pHYs oy vpAgxLIDATHǽ[]̙Lrq2J4^0&K|AE'A ojۇRJE >2ږ>PVj)e[K4^&9gr{|32IZ u6^&g;=O]aZL\ަ*5sP;?LW[ շ46[ҬiEKlg<<4b׾hXr^E@Ӄd$kg{XQST# #NjnaƦ#$/#"EC'aM8w`1(.,x^Q^ C5ŠEJݷFe[yV3ZUj- \.5@U|xg ޢ!`Lj(1y bLᗵ93L{dTp T|J yOvS¹=Vc~xZ@X܉%upG8uZ yCB9Lg9FĘOA6Q޲+{x5mm~wM]S&.Iobӏp "Ʀo /o~/sMt?D%)"&H4"PMQG5%޽˨Hگ0~mf 5*1@]DAՃZk UO{gȮ P3:޷P"Sxƻ&['sT=+vq\s|.(CD@"D -L*dYA5АsQbm ڱ8&ol -| *W%Ch$_SOZ'-܅ziCLk0f >X69:G/T F'+☘yE~Ze otdUߖӠ1E׳),h W Uh#mJ1Ah8pk/y~Fyx0) &H~}>D lkr& L ߱}ףȐ_%@Dr(/Eaos9 >w ts`|{|w*;8r}Jp)^U?'f^{j- ]p#|#CqDOwR#鱧N t͠Łl aOߝ⊍%tEXtcreate-date2009-03-30T22:53:50+00:00$Y%tEXtmodify-date2009-03-30T22:53:50+00:00Е/IENDB`Basenji/images/themes/Tango/24/properties.png0000664000175000017500000000143612067326706021255 0ustar patrickpatrickPNG  IHDRw=bKGDC pHYs oy vpAgxLGIDATHՕkQ?kNu=ÞI@9 !g޽B졭Ŧ\<嚿K b @b"=,JIl^ڵU :0f~{ I0^ՇTJ|tyh~PSAMkF@~]QJ!" 8嘦9Q+,tqq1QOr(Bs3D"_v>P "h].I$E< ?.9jd2I*nڃP`6"BףQT8==]!p4ez0eYXE<lh6$kd7 t]ŇضwۣnKJ80  \__s||뺡)*vH&eYR*Fl0bN "\]]ME V 41 c~Ad2MަF[v·-vmmmmluZ <;noo_yz!?$OD(`{xݹ~_oػXenjAu%tEXtcreate-date2009-03-30T22:53:45+00:00v%tEXtmodify-date2009-03-30T22:53:45+00:00NIENDB`Basenji/images/themes/Tango/16/0000775000175000017500000000000012067326706016350 5ustar patrickpatrickBasenji/images/themes/Tango/16/dialog-error.png0000664000175000017500000000121512067326706021443 0ustar patrickpatrickPNG  IHDRabKGDC pHYs  tIME 2SIDAT8˝OQm 壾Mh ĔD2iҁ";2tf#@XD0hc$-M[(=}KOrs9nTR<ƽ,e`z!~; -L&a|*3ef39x7Lr{UE XCwOMRSWt2^,F{sm4@UAEAi|?öj2CX[C*zbŅ1S)>olPkf-`~2rguPqTqy<`>?>|DE+OoA5?JDQ`zpT?P&×AĽQ7<7UD (Y "":'V][x%u7:NCPcG" lZlg w(CO4Fz`VW*H$p }0vrjܺLv_“QEEpM::_΋nOGfXvwIENDB`Basenji/images/themes/Tango/16/drive-cdrom.png0000664000175000017500000000164312067326706021275 0ustar patrickpatrickPNG  IHDRabKGD pHYs B(xtIME55*})K0IDAT8mO\ew8g@R(e. Mim5֔Ru+[(ӈؤlبEع@$,`(0snJb˳xGpↆ/}@L_/NcD۷?xղfz^|21M_~y^.,,R)\\\ rXVCٙcN;v/﹑#@aH)i4"u'mV,hCÃǷ.//K9PP?G5Bt03yyҧw|v7Uq]]7hnn!NkkDJu&ՄO-..n@γJR sͬ/޸αR^&Oygt$3MS)0M! /<#}b1 8a@N?S)E躎mH)?4Lq<! @H`hxJ)R:h;ץRꙮo]{[Ty>t: Оjgwog_$=D"vvwCRrJոi躎eZU/TZS!RŽ{ԏhBi =cXG+"@J ]7Fv)%GGGdYO޿;:P,XMێd2q0 ,L&#_g4Bhs$;;;Kڕi˲'''W ʼne߰_Rt !Dd9 QnJ:IENDB`Basenji/images/themes/Tango/16/add.png0000664000175000017500000000050312067326706017604 0ustar patrickpatrickPNG  IHDRabKGDC pHYs B(xtIME DxIDAT8͑``rҺ`6[;tqDdZ &g7Z,Vi1v`9=0+n/\ϵUR>.009xrbD["[-$mx\9XwV2@@PiAkeRjt&Rȿ&ROXNOӅ43kgO=TrK wIENDB`Basenji/images/themes/Tango/16/clear.png0000664000175000017500000000140512067326706020144 0ustar patrickpatrickPNG  IHDRasBIT|dtEXtSoftwarewww.inkscape.org<IDAT8KhgLHBHը+& ҂JKvэ" ]Rƅ`Ku 1-i411qFIe?O+Ec!pQG`s8Ʋ @4߯mڰ1zt^`qET*-XHs~SIՙJV|Rt}#ה]K뙋Lɧʕ7M/JDڧNWrUsK;=rT%'_A*vitsGWvjUC3F%њdS}k9$j&]toeQP5~Pν_ ` )RI(r;͵:.iB `dA϶Ր wj2[ԯVI8RwU{#e`g!^̌#^UVJo5RLZ[P">WXPFDJOz'yMwqcLL˥ep)DX6 EЃ18o #z)u=<p ݘܺy%oLe‘ߤYQ{/'e52 CC}Y‘wҀ1t =v咆?jӣkr ;8TR-S>L8xK~C(IENDB`Basenji/images/themes/Tango/16/drive-harddisk.png0000664000175000017500000000113312067326706021754 0ustar patrickpatrickPNG  IHDRabKGD pHYs  tIME5|wtEXtCommentMenu-sized icon ========== (c) 2003 Jakub 'jimmac' Steiner, http://jimmac.musichall.cz created with the GIMP, http://www.gimp.orggGPIDAT8˥Mn0@ &j$p7$ ސ'@,Al"(U{~3E6O'Zc9lU(ձL@Cf3bE!}@ *H'D>S=Ы TeYFuLAEQ . 땪0Ɛ)Ʉc@$ btk-{vPv;mmKa<m[=㑪PUT$I8c97*"|2N#hLE ,ZKYwj\2gzվU&l IENDB`Basenji/images/themes/Tango/16/dialog-warning.png0000664000175000017500000000113312067326706021756 0ustar patrickpatrickPNG  IHDRabKGD pHYs  tIME'-wIDAT8˕Ja;43JFC AJ0Hct"]t0 \teBEIVP>P\ \@I17ȴ;gsȀx݀/|zyxpG@uOHRZXXОRZ VC 0a/ zbwLIt8l,z>ϓ-e !v{^aR Z v "8=bc.| f̙\xrg\uݑ[Ra&#lח=8`^K=@Dn=|C>y' f"/t 4}IENDB`Basenji/images/themes/Tango/16/find.png0000664000175000017500000000115112067326706017774 0ustar patrickpatrickPNG  IHDRabKGD4g pHYs  tIME %/IDAT8˝MkQ;$MfJR ]hE Uw&o$ADtYwUM;AT(VP5G'M23EHIBRgw=GvM;N!#Lv B]wf2f_Kдkw߾J9zjmŋi+dk&nߌĢ5(4]#Ns ^R>q>sƕ]$ ORpsӶQ %#6Kot Kz Xd4,U~_e% EJvK0n \$[5ܪ-]pi-Nlc5ߣ-F}=kr+Bt4M¹|'+7*|\YT[z,?",+| 0p8TNVdT앬/dߧ>xtXtk뗧d3 ;e+D, Xp-f)7",3x_3ԁ1|tSSRƣqwp5Xb55ϗ!;{]l8|7\Rx ȩ45K% ѸBóK(ԽɁZ Mg˫ * 00NqT[ኲ򓚗Cs) F%R4VՂ$O=#Ʒf8.B/}㧨5&l8-J.5m_"`DUXÇEDثՂ4$C˓#YDj|Z a)""f1B<~?DtL6@{sGqp6Mk_c ܃^G/x 1eh0!D RBH3]nWJ]pNtTxK'Q14VR,DSp 1./Ehퟒ*7j=֧"*q/3N;Ǥhe>ʒB뜠҆Ap߸H,NMfmOYuƩ-Nj7бz:_$M"PtsL!H8j4CMі֚nޤs'?Ct>($}}Rt گ[X](`sZqLѠ5?"XDP| o^bXD! .MuJe6JV`r77ܰ,.,Rj!l~\D$//񺺞~a`hbb ˗XֿץZ6>c0QzS†> ϣ&jYٻw@`xGV%Y\`Mxs-곀|mk,+#Za7u9 ?=]eIENDB`Basenji/images/themes/Tango/16/archive.png0000664000175000017500000000103412067326706020475 0ustar patrickpatrickPNG  IHDRabKGDC pHYs B(xtIME IDAT8˭1hTAww=b A I#MR (X( ;H) h,Ebl"*Q]۱x9#xQفٙ4h0lڑВF4ѳWc[6#H>/bJi"/3sV,1;ZEsSpZ8vKo[G-Cb 4ET }W(Pٲ ٰ|r@ UPmҏHV?1(>9! d Bj}Xk`<h~pb+@zP$3_F0׌Q3_Aszy]❇{ 3Al'2=֮G%J=.]q{ klf_o҇)IENDB`Basenji/images/themes/Tango/16/go_previous.png0000664000175000017500000000121712067326706021420 0ustar patrickpatrickPNG  IHDRasBIT|dtEXtSoftwarewww.inkscape.org<!IDAT8OHqǿof~;RblB n["VLD"%t-z;$% n$W"KPl0wz{RJ7+[Z+a X&殅 e>83qI%,HX,ܹ{MV@w "F$Q"J1>6App̈h J!R=kn;l6TUcdxQTUf57c 3\@PUUr>_9-MA2-M|TUH3ӳ˕UAL! WEsD6#mxd"ɻ3]O$7>Uv{(,,KerH&|5D--Vڅ_Oy^ve90o# \. QI2!IENDB`Basenji/images/themes/Tango/16/preferences.png0000664000175000017500000000067012067326706021362 0ustar patrickpatrickPNG  IHDRasBIT|dtEXtSoftwarewww.inkscape.org<JIDAT8JA{'!`ps)‚JQ1BJL3FHI-Js-dIXw7g k3{0=$"_:ͬtDdyFUlfi$f3D^h4$.EQl=lrv~^/uvFJZug`> ˎ~RɄӓ6N|pPh=x jqy EcP{Dϴw)$J,e6݀(3UUF6Iz6_f\'@ew(s@Od] *tIENDB`Basenji/images/themes/Tango/16/drive-removable-media.png0000664000175000017500000000077612067326706023230 0ustar patrickpatrickPNG  IHDRabKGD pHYs  tIME PtEXtCommentMenu-sized icon ========== (c) 2003 Jakub 'jimmac' Steiner, http://jimmac.musichall.cz created with the GIMP, http://www.gimp.orggGIDAT8˭JP)b ! v/:7ҡ J3HY:y,p;H 7ws84eO/w䱵*>VKPJA+ttwЩhQT{pBVnq8I4 2?)˲U!Dfw8_a7:{`YI8/޸7۶QJ9qP/ۛ!Q3GWGNP{QIENDB`Basenji/images/themes/Tango/16/audio.png0000664000175000017500000000126012067326706020156 0ustar patrickpatrickPNG  IHDRasBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org<-IDAT8?hSq?{}ɋ4H9TQ E,+AtU7QAE`6mmӦM^wuĥ7qw|DUImn{1U FG8(mYOu +GqȲVT\ѓm>AP,!r^VT.#Z'[IzLW!ICd( ^|_o62QlQUL:11[lU =n)ͤtSUQ@""<X^d)a5CJG,vnS@;dm V053pmznĈedji5C"8VcPĽxm9Ϟ99|J哳QCB3xžC* u\9ZG?iE45v8{gāﭷ,WSq$ 1C*\cS. izָ.s݉VDeAeFT LD$q\Gs+oge1Fb1%Myu15&IENDB`Basenji/images/themes/Tango/16/remove.png0000664000175000017500000000036712067326706020361 0ustar patrickpatrickPNG  IHDRabKGDC pHYs B(xtIME ;"\IDAT8푱 Pi:+#mF stԶ"DO!ʳ3w&H6暺`?S-FIENDB`Basenji/images/themes/Tango/16/application.png0000664000175000017500000000106012067326706021356 0ustar patrickpatrickPNG  IHDRabKGD pHYs B(xtIME8rJIDAT8˵NaofMH(`; (h aH7Mܰ`p.a4ހѕqB Q i e(.ffvY>ON!Y\ZYxz:IDd9gw=J"bi{vDҸ3>Lbd(T"/]{w]ItM31 ,;sDBO8=Xvf*dk38F 7Pp4Vھ݉\3o"5 egWָ:o]\9P$flX>o,;3`2{50$Lj3 r |C|.[8_.R,LDRxFMIENDB`Basenji/images/themes/Tango/16/cancel.png0000664000175000017500000000146412067326706020310 0ustar patrickpatrickPNG  IHDRabKGD pHYs  tIME - kIDAT8mOSasm%@+xij 6X\:8iL q1P$(Ji;&_M{Ua==1DUv \Be3?k.]vͭhRJiY|x23^(X5*FN><}j&1}QPȑ|8v728emZ:M W,JgZg&xccw6ǪG Df8޻w$_r<֍TD"̻w Ծ>Ԗu~ ڷEJJ.hϟ( %BaՑppq]Qpz<8;wu@ y%%}]pzXb1mc6 ;Rww(8vԅB*,e_)D V[Z޺e=gutǃ=<혹Ʒoȕt)冚a ,6\Uxqx4рԝ:iբ)+@[VJ$(~MOnޤP^\$k$oF4|~?%r^S'[AW*gX-kSH c:`C6"Orbizi~inU|^L= 1mv?x.ElBZVO$֧lvƆ(,nƭ"zvWiEay3MR׆IENDB`Basenji/images/themes/Tango/16/edit.png0000664000175000017500000000135012067326706020002 0ustar patrickpatrickPNG  IHDRasRGBbKGD pHYs  ~tIME mutEXtCommentCreated with The GIMPd%n?IDAT8}KTQ?ט-rQtӢHhaP!hA VXAE.hAhU hah89ha4{Oq3i}W=s>眫XpR<# .E9N>B0|~{zaf' Ԉy]՛4=!(o4_(vA6m۴ ٷ{C|1>z7faY) 8/)I&R ˦ ܋=8Ko:@y+#1P˲dsPyZT v Aa6;:QJBgWPM0"WB2YVVt]HSX{v?t]z@VBpPTksC6kXIENDB`Basenji/images/themes/Tango/16/text.png0000664000175000017500000000051512067326706020043 0ustar patrickpatrickPNG  IHDRabKGD pHYs  tIME8`&BIDAT8˭=n0H[!!l"A!QsL$^Xj,{|3m1 Z;騬8xt/5ǒ4MW(w=ιURW/P&AH৞" bc TBz 8?ͅǀS_x?X`UA+Th8X+u?f!-^tjt`C_t`6iwZհy_ qwTh3'<0=4拂0[(f_jOێc& )灐Pdϩ˜B߮~3/Lmi1^^vOm0oٍGuԍI|ƘID:W9a\De9ͮUkTsDi'{Zrwfҷ[ћIV'c@jyWV#nTWՉX$osIENDB`Basenji/images/themes/Tango/16/file.png0000664000175000017500000000115412067326706017776 0ustar patrickpatrickPNG  IHDRasBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org<IDAT8uOkQG}o!EӨ~ 7BVѯV ZmEJ%M4q#d{]d20\yw3ڒ/Mm02Ĺ1wnοefllz]Tt`Ξ}S3z9¹S'OsgoMӢkݟtYykQo<{IUb jDcD5dYa驙oW^7 1b10dY֗Mxh@"f,u.1,p՛d,BPbU3+ 3j5\ySM2B0$oEbT#ְL.yljAJ5̴(L*3߁@<*xpuAE"ġ%ԤlbpaE1EM%It&JJ͊4Lqtwo5~s~s8T\L)%) 1ek^v}STޔ0bmeZqU7S{z?\!&,zIW׈%ooߓc,RFg}ZUYEӣm%Y{[n=v_0kEI珖D N Jhs;u&%srm'$=Wn/@ ,C-f PPn(.*rraB+YWUH43 sW߽%::6ilZN̾24PU}z YXXx(7VL6^|IENDB`Basenji/images/themes/Tango/16/close.png0000664000175000017500000000121612067326706020163 0ustar patrickpatrickPNG  IHDRasBIT|dEIDAT8ŐkQĂufTlM$B;tR5PR%IuѥEn ؍X6I2ƅF%3t&.$ig]=pԂ_܅&m6+Bο /uG 6=zp0m [c= ;R+^3H`ӽ]5v!0A aXz9GPZSHi mWv 0'zNtٜ~)N&!P]l:0 ":0 =igy|NnݭjbLv0ʇSMAR鳮gX!k5fuYQȮ*{}u2%))z˕_ C7zvi5o #0pʊ9EdMуBQWw[ń(Q/lCx} o ~R֦-IiwO/XNG S|IENDB`Basenji/images/themes/Tango/16/drive-network.png0000664000175000017500000000127112067326706021657 0ustar patrickpatrickPNG  IHDRasBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org<6IDAT8}KA?ok&ZP-BD[].A$)AEu:U.% T4B`AR~f^]75]ofW6.wmPoJf@Vcfff6tc9s.ONNF,`JZ%؆8;LoBzc mT6H\*Jtuu9GRauu&0Sդw7Fhf8=|aݗ,`EQPύ[!r)vPc#YQIU#sfy_vxK;/-1T"s! 3IJB !N4yHdfMj3FVhFJF2#hSd^hjD$+A%d^M(<*| hc}8n@N*ADRhΎf_>`~bP?^F@RJz39LLL077'SS|xq`I޾[X.Y@Z af,..qs=^ N)]n3;("]GWiIENDB`Basenji/images/themes/Tango/16/symbolic-link.png0000664000175000017500000000071312067326706021633 0ustar patrickpatrickPNG  IHDRabKGD pHYs B(xtIME  &y.XIDAT8˥=N[Q36 \ o!Q@U@g#*P Lm,f(.6v8#hs>pfft{\ԺNVc~O[V)(iHH $$qs{mO_ "b@;mdƟsHb0xQL11E k1wܝ`Uu=`n4iqRq3 7WxhMH䜜lVDY&`oHꗚ:j`*g0E=5@$3B Jaiq(㙰jf/^}!?IENDB`Basenji/images/themes/Tango/16/development.png0000664000175000017500000000137512067326706021406 0ustar patrickpatrickPNG  IHDRabKGDC pHYs B(xtIME )IDAT8˭MlunP^G IxhDK `J⁃ƣ=`LAX"F%%)vݙ9agyFx(f p݆Dd.~nj?7Cw@>9rb1 1[ro/ޝuL> \|l@+4Cs,Ȟ#oR&Y&@.Np!x] = BLz3Y@05n%)=H H:N1v ~ Oh["MA,miMSݢet@`;GiEoA´`2F]NLRdVtJĬuAp p0kpkҭXYY4=T6mo:#nm>YObju rrY=9nW{ x'_msLVVv=sw!$cᯨTu[=iu@oE35soݢ̯ a ҵ>0-^/f8 sg?bɓxb:6U>ϝw Z߽|J_3}o*gw<[:Uu]tm?([JIENDB`Basenji/images/themes/Tango/16/properties.png0000664000175000017500000000072012067326706021251 0ustar patrickpatrickPNG  IHDRabKGD pHYs  tIME  +T]IDAT8˭jP l"ނfuء-8(q%.]tiQpNDdМ)v1}qAG%rE"糈d0M3%Q~¥Dz׍j5z^u:JR r}Vv5Zk`:bfneYXVjWwpθX,<A$v{sN-fb1FA0$ C!Zm6& B\.|>RJ;pza4$h\..v-4))? ``0x}+ڶm1$IENDB`Basenji/images/themes/Tango/48/0000775000175000017500000000000012067326706016355 5ustar patrickpatrickBasenji/images/themes/Tango/48/dialog-error.png0000664000175000017500000000475112067326706021460 0ustar patrickpatrickPNG  IHDR00WsRGBbKGD pHYs B(xtIME"2 iIDAThZ[=U=>6Z6 V"D% a > J8JDJW 8cc /l3驺{zz^/RK;gι֭5?l!9xYQJJ!I H2?Boo)@&vbY([{.1VQCT 2M,8ғrqMA=?@wM5~X]_5L)J 9d. xA0BEl" #߿T+4}u7|KY`:ETڭGUnPWhhpy? =%D Is c &ΎOOfq. &}ݑ6 Dk+HEG 6J7o^csТw7S lIFNGŇo˦f=.ff:zl_L54h>VnAH7[w+1>I=$:q8 _IA24ڵrCq ogvGpT'vuv(hF!B&;vBn`Ε; P{ihp(@  JCT&%ҡo[5;ƨV0Y*T щ+wMѥK&7ل|#uɊ,[=f i&lii "ŠC!o xz'2!rGVnD6 /|G- h=lͪ %UmF3 cF8g1 gǎx],5ܨL@1sH뻌f(A@/#<t pEdu b4*y S-WY1Ғaq$c Hgi`sfw4yidUBeQUN ΂8yb 0*D*n|J$xWv)<{Kʳ0iJxT9[񊎐$֕/S]CRŽST^"_++< N)-e Ai8`y$5 A:\ pPK1Z̚U< !Z BURҢSk+z˰z;Bb@u^ňȚ--JqD&s+#L ';e{af9;,p<@1SLc,Bt? 6oa\,S^ He@:YJ_L?t$k0'&Jw@&Qrт>diIDgff2`B;H$?S($*5p-0V\#Agi U8575ad'>_)ud: 9; i]˝f-i*XT\  G|snl @'!np.MLAT 5#HV \yZJ]v{Q8)4ƱkYRuÂfpRM9Ek {XvK FJ_YdNӚHՏ.KXHyNɀsxV/$zeQ?'R7 Mll cbM|2=$3]LQ$]3Q3V%sa.ˏ+sQ[BSg3wZنpe NH)u{;fQ$6nr\T45JEH``e!3:dYw}n!?ԐY:ibΕQ:Xx,k*!k =!wGՀ[rM! 3ȹdS&<.DJV Ks}}$iW&')G>M n[sYZJU.([ҴBl"*J,O fk8/7X6baR w*B؎<$0kj%./IENDB`Basenji/images/themes/Tango/48/drive-cdrom.png0000664000175000017500000000770412067326706021306 0ustar patrickpatrickPNG  IHDR00WsRGBbKGD pHYs B(xtIME'DgDIDAThk]Wuk}=wf3 ~H[H_k.]B3o}O] 0dfιU},tzW{wࠍYr{ .X++_0;ΉNpA7ݻw0::w" 8 gGVVWo替s`frmS{i8pRTUE]E p vp!!P qai:џNjk 788 uxځ8xMÝ[@ 2dYs㓓|U__Tr-Bv⢋.biinKYcG4#188>4dU߽ߞ7͟;|pL뭷^jt5Ueaa!U154*QfM ̈0ݸ05Rf U]W:4><4'?֏ ;j=tPB`yy}4F5E jhh8)AO`D-f 9x ˲ {LsD@6I& ɻ`F(1*Q EPE0TT/\Ftz:,{%\g' Q#QkE 4"RV h5huUW]FS N`hhW^ye1KW#<| ZQ &pe*#^ d۷On 8' 5IDh(U]fxx .8{O5zeEQ\k.ʲw=9KQռ EPuQVVX_(X^LtkTu @7\~pGqg0007YY[ /YZZGT*dv!'3GYFV֩n?,/_ k竆@ɫz޽{zMŹԐ$ݫ+C\Ĥ"RF{q>'dфZbZ5JMeٌ!5~)lӳq]vTmJT 4b*Z0S<$de0 PPkZb,<{aQM&ZjNpjڵ~ٿDDGdYv޽{Y6)DqSz~{|,.e~>/_u짬+ֻk\YTa` D" sbQ<qv088x7+R0['D 58 vψp ['g{__x޽/ᜰ*r B6`\S 3ث^n;A"8OZtWK;}?j|9竃S3O-t8Oipfc~m8ѯ"fTR5BtTO?-V\S!ֆūMȽxXyjbӔ$\L&FsKm̿0Gy:%@$nH,2("Vt:oٷwNr]EbɲTQxVV15"y(Y^Ťˎh-Owm=Z[0k@x}3O׾tcΝ;?~"Ve\,K9Sש  !-s6 Ch,9 I28LbFu X155M _}\v~Fx߬yRg9VGk]K K,̯R5uYr %!s 1aMԵlNgֺy}`ee/xH/&,4@64N9n<]B|3E@s hDyQDDA L*Ks]3Yt:G{}-`c%yGs/)kv*-˽pޱ 1Ͼ"eóy.yFhnf Y[ qpDpD.qҪiUt{߉S}Ɂ>˲&MӪbQ~L 8)iUKrQV>ɋ9f~9??o - |?o^Bȶ%ajUj0]֤Әs5@DjAj{g}o_ڇ~x-4ɠ_r=zbNL}./8!L3p!ItHzH׵񄒌 q,+8>9~}<-~륧5(C>GyVFS;QU#7pmlȠlU!OO>_z衙 )OkܙO<13;;hȞHh5*#D I^Iڵڄ3;;h]w}ƫՖSOC>[^;;w~z*ڶmx B*KU[9yR@kTsȑ=zt18!MʭUmހp[ z׻vɲl00XrYKO?3iz_|,~hQ lgIENDB`Basenji/images/themes/Tango/48/drive-harddisk.png0000664000175000017500000000360112067326706021763 0ustar patrickpatrickPNG  IHDR00WsRGBbKGD pHYs B(xtIME'%7NҤIDAThYKo +F8 #Ųyd1(9"a2Y {$ςXB( ȸtW?Tis"Ԛ;;T5FQ.JO *I>~4fsr|ζ@y>VO$bV<>jZ[!{_x2 ERdyc gΜaqㆳofhR>(c}{ !0 ,--}S,_VWW(eM atR 4&HYymqX0zbY8KKK B|,Ce², Xrs. aHR*y!Is0 QPVݺug{&l6ySR 1b4PxJi~JxOaׯBふ7o". UgY<%`U"òKS1;wW^5&j eԩShjaA@JWOZSaHBgϞ+cȲlueei_j5ayJiF~= 3p%(kW\AݖeY#-,>E_?{(333(˿i4FhZǏ9i0`F55U &FumFH/_6-˺;@eweAHȶ.\K҃uxYGab~~^21 c… h]uGVu.!]jQ[X0ILMMavvf@fmۈX mP(MuSTE4QaqqzMv9<!boJaW]:bJ/a98lZhZRԚ28UK{v qPTTO10H.b}۶Q*.!#e&89dY<18瘚iLJDQ(8 " cYDii <ϓQɻ<>8ŋٳM?,?1y(`&80 LweKlT i4M0V Hj5JFɓ]SHy㨴'FQ~Tt Ð, uQ.u8ظȲ R$fW.m|MOO,4f5D54Z-|6> EG>b&s}B^Q%aif0Ho ^}:Nam—HkTZT@TUdY$IaKt$O?z c aJ2o^ A97cj[5'a8$|o$*5.9[,6fk[ 4Kh%B\QW&͚]WMLELaѴ*YJhKKg{;-ZڒB1ܜs~sܖr[~"nGwBZ^@Jx/BxKbfV0l]|%X0Bv?>Gѵw/%i>__^-7ψ}5}Nok#嗔כ.xgz#3:3xijŸ7;`%ϙc:;܎9r 8޸x xssKssEqZԹs~ t&g[*SCAB1#n,>R\3grt䯀-aB0ǓNqǝj^O MJru$۱ij^_\ kk~{<_׬Afe9ŭPHuPr $ٳU::9׮EC$;;IMo7Q=ٵkO"<۷p8 @ `ɒ% ϛG2F&E8ᇑx4:g |y,bqu<}DGݻm۶m6sSX' Bo AUV?x۸w<zO(2hD0CxBvY+W^^.D w܁Q8v{LTxֈ?h&P ` !@|>X! Bqy5 E Wi)ҥWʅ&VWGZ}cӧ&陙"X3$^~=F +sk58rѷe ER7N0ƍXddegȱcNWQpUZ.4xԪ- ֆ.rrl6 ֺ{Ǝ0~0Uw,4-[# ʔ`дxn;5҄)rR~)3fuZS3P%@Q4Ms璑D'@NN;H-+vow_w+(Ep+rݻQkX !mfTUU]W 9[[ׇC>#G²p\fgFI )@r͛7l2.]֭[ ^Y!Յfr^x] FTjժIC6ѓ^as8S]"Mm,jj&k1Y r 5wi <@Y:u|E`yWd퐮KmlF>3E!c~\EE#BpYx lfÆ Q/\ \YՅ4Yرh2-|5, `̺ P"_|˗/_>*>ϟ?dnL3H&:;;gvB1(»70xbG ؑ7nDI-=g0U E@!6MI;9{6BFB LaK;G ;L_Tri_75`ֿGQT4aHv2B!! m{ WZ %AmaUeEJ,(]I{->׼ l6e޶|H9Ǻl{W*s+Ө aYʭn\OyB:I6qzq-f81 .}2mx5|!t$Rc8 BT|(&Dr5IENDB`Basenji/images/themes/Tango/48/directory.png0000664000175000017500000000310412067326706021065 0ustar patrickpatrickPNG  IHDR00WsRGBbKGD pHYs B(xtIME&3IDATh홽$ko}twU  S @L$,`7sDlF55Phӷkޏs knoG̺ s]]S9zn&n:G}CU $gg,;ɓ:з[%~W$0g=!s& !~ǻ$IDl >SU'&_䂼T󹯽_O* "f3Bϓu7{ZUx#)&"$!qĬi3ͨ|xэnhzb\#P{ N5uޗ9`>3>l(4.Uսs 9GyN4s{2ĉllUHq_J9b( ʑgk/!Um qDX*kfYFh2fA6 M e޻Nl&Pe݈EZ,c<}F>JPB ɩƞ&W'X'* iz9gTaQ6xa5HyL$rI(>UU("zQ갲`iB(˒(K\z(oDd |w?z>Qedۘ|ދDxSF#EVRU%l82U qc/.TXkhD20S'4VA@aaQ[11B,)@јEg܅%\SK)+ /.L\x,ˈ i:/=Ձ8F?FE$zZ%MӔ g\%2%{׫hcZA_SwA(j>n y#0mj&кKxS:50Yz> t4ᣜ8Iz神wskz4zd|&NeH>6BQҴo~劅Y]J/6f_ˠ?qt!`zbiȖrK w+ P-s$r:h|$ljAb.~ ] }K'|uFXIwEo0 &CIENDB`Basenji/images/themes/Tango/48/dialog-question.png0000664000175000017500000000443612067326706022176 0ustar patrickpatrickPNG  IHDR00WsRGBbKGD pHYs B(xtIME#/IDATh[pgWd `dd`l%$!Ё m̴iSf&2ƝLhb0t mnɲ%d˖u9ڕWW_gtfw}w=+-d*-]McdpQŽy(Ӿy,^kx{5ڳa?Y͙[.^kxů}2cufY?bb#AKmmsRC'& ?I1@{$ OxQt# yZdI$!?*\ 00ƒ"DVU>1qgT9@mLv@^Mr4{ C(#@iE阫KZc9NmÐ/ #"χ\tWuFzyH&>*9~3ҐB!HOMAi(5j(Oxa{P6/z 14s?Qz c[cm@i(_celT,tqQR88fc]>8nTq/A?4 =x;@|%s4ezF3ε~, #||iev:? "eiS#t#\\O4 ޮXy M&+!t+|{S߼FnOM;nFT )<xC(?^:-MŐ8dbllZ<Wl66lj~,7}pG">V`( ı (W={ '̉x5OM4{Br#߄ebXŞ7JHq*]\LW5.\P==aަt4iKB$[MhSMkj$ y眽0w`;0:`2ddkЋ^1ĵo9xc|r©B!l֚P%g-ODlxO(|)o:QJ /PH !PRktRr<Xa˲a!u> Wڼ[B m_WX{ڡ_zN vJ%WR H JJ@ D"J'~IٱH6fy߂E)ԍWQ_fiPɚ8I|}ML"V!A %)R8~֔@Vm}$lG&%ҹ m !=c)W8hm73y5aE*ȉp'\T9>-G`Y6i:bM+$/ږ?&D7>ޚ}mE]* Y7'hc -aȴ5+!,dxj1O`,0_F!ю1 n]73Y!HdC4B":o~i?K{UӜhIO.' ̑d8vAP\F<X!ўT^{kqqhp]ui#"6vk&= l!l*#/lH`(%Z2ZՏWnyy(ZBǵ}";[a*P}GPM\CU+$b^P ijfMhY=pu {U-Gs'w;n ak=H](Qc ߻ cF\!dsVKSb`kGډZ 7HY0e_@PY|B &Lʜ%lT>k sVSL;c2v S*LT)`wTI>㯫~tTPF~k"XsFki]YP>7v\{dp'}wLky*̣S7Kk>7UjU Ne ] M/O+(n˟SqykԉP}eEaֲLcsv%\Ulժm!{v<҈nlWv Jj'ҳ h%+ M !!JV7@Jx7' Qt]vupE,B"CKo#QFm5@wO5k!D)ݣH);e= ~5 ād[Vw7R\@LvE-H 6(QZlXޤ7"*fBT HˡTJ]eqYW<:rcPWRq^F~|>͞- G?$*U%j>x)L'0"}o6-MHmAD(x{ WszxVr\ R~ y&˱_(x]Wj`:-ް^&BwIENDB`Basenji/images/themes/Tango/48/video.png0000664000175000017500000000671712067326706020204 0ustar patrickpatrickPNG  IHDR00WsRGBbKGD pHYs B(xtIME7U OIDAThYklucfv$KEi;8d9 -hiB%5P4H i7mrl%۲lbLK.];;(8m{g08߹;-%ܒO!ӾɓqBB>.Nɞ@ M|RD?̉ @b >cޯ3Ϝ*QJXOM%S\U5Ȋ s>\ρeV]* G{'oz橻%s~ڶK2 cciib\7>1QJ}/8-DFmgcλ{$ܢxcWrO>iJ<pY}EȮu}`s|Ognر:9{'L&},\ƕ+Ȉ9ǎ;_|PS* 2 6XzR;>%e@[(EIULc8BVlW,bO|OgOn\k !lǾ)OscDGE(!B  ~!poj"+8}t\+7qϞh5#!X][ĕ %6!VZZx"^Xsx[7@.!F9p@ Ld"$ 10c " ޿soCv.RX[XXgggF̙׭qЃQ.G~$i ZTRgWGnL< @e`!b.D,X<Yʺ:!9[ݪ?vl'Ѳuzt';nJc0jUUUP(QT!IX ---o"\ !+2ىx"s13=TRPJѐj"+FoOOԗ#]wSS':u-]X |?rajDEREjBSuضޡw˴*RzcK&R0- R ͵%D\C49uԮcǎl_*ofDC Eq]59,I% D>UiލqvJD&4Mxvx}'KbAvbH*(%anc,cȎdYFkk+J++ׁ! AYD"!".o@X/sy^ BqoEX9'm/t]C6i!,+02F9Q, @ڮj-]TV("ܸ{ d@!86-KX/#C,CߞxMñB`ЯHPV`;v Ʌ,D[[&NAUU0aWmx5bN:.t]GT10 Q\.afj4AQ"XXrq>~@!W -RJ4~c>tC((Jȩ9Q jAHR87|x tff:Mi+J+%>ݏo\[U=׍A㤽~U0*{@ E .IAgWμzMiQ7T2YVppЁ&pur &:u% B@ 02!"%@*qms"EQP,BlT d}1L%d0h,BяF/A$DTHFY@~=W00! k]]Ǒ80: èQts]tuvvD /Z!cwضMUڶM]ǥ0t0\ }/W:WKݔ~!^J8TUU]:sTp9^_7){dgK.MӓLf)F~ų,N-LbbmKS 6͊{w/? HtӷJ'Oڢv3'( @$(JoST*'(VVVZ.B4E10~\"ynإc I !9^666PTpСE9* J뺎uwaxx^'NѣGX\\+X9\.#L"zΝR]E wuu{zzdc R4M63 fN*"FFF:UUM2 >{l$"Nl$NQ圣Z]ǦFJooǡ* hj/10EZɚ>N"FQݻ[9$I;e$Al. s?*ceS$*%&2ˡZRV!9VWWm{ۺXq+EP G0!j6 :Ǘ1eT*tvv7X,~-~733~^ޫ 5u!ɠ\.?^ZZ*%1i\Vk%ڱT bE)$@6_7o[~eIENDB`Basenji/images/themes/Tango/48/audio.png0000664000175000017500000000371412067326706020171 0ustar patrickpatrickPNG  IHDR00WsRGBbKGD pHYs B(xtIME36<LIDATh[lT3sn{߳_0`H(  B P^ڗViV(T ҇}iT R4JJISEmi!p{9s ];kc'-?Ӟ773gXE[E[aMKRDN0ک44 K9yl:}c~`]+):֝$kV˅@eQpD2Akmw ^.{G%(Vd3|A),J D*ɒ\D\C1 %$ƹFŦunij4dd5d hE$G$±bP%x~B1R"|16)niyZ~O`[ V"ƅP "WO)4&N±\0 H(%<กo l+r8L P}u2 8#)9| >68j F3~6;eb1=t[I}<]ZB+;!Rbd3Y/L^^}u^ %h_c@`+?:obRs˄3|wjtd@Ccd$A ߙӏD _2 #}$Q< y 0Ϧ6^{,x I 3ī@+M,A8&|3 X J_h ^84*m!,ԓ' {̓K! `'cz&:҃J>!t`6' z*C-J# mi‰D9N +Up /%ԽJ/.BsxD*Wٿy&cݚ/d'<^DPbYn}p Þt"rbg;w&$>z|1:/%ppǫcsxeDZo;iR@6\j^/L*g!<䋐J0Mci'u> hHYI;w"x/on߾wMѣGgܵk>Zz A٨ (OlwP*uR+V&ߍX|Q u"hC$ &ڭxxw#,N\--g6Bra[1Y]vErĹ dzC60l"p<ӳo3hcaZl`ҢT(lnTGKҪ;/ hrWQ5 rfYL۹/ՒJa3XE(\ ՛ (6M 䔞y,hfL{_tx#d*y1Nf@ WZBs'<@OЍ h;M!IENDB`Basenji/images/themes/Tango/48/application.png0000664000175000017500000000526712067326706021400 0ustar patrickpatrickPNG  IHDR00WsRGBbKGD pHYs B(xtIMEpL3 7IDAThYs[da0LӂMB\f:ig&q&?4ӱ>u:]ć >⛊ı1Qc0Lj,2E^}qbl򡘠߻g@|< KHfNt|o}Wթ,&i BWGr_tn1g h.1)EtDB*SXn}iy"]l>4w–M&F5JUK75lvn; >k Y-߶mܸBQ#Btu1e۸6A6//K#e ^+~ţϹ >2+}v("!+97BjpljkF0Xv9bXD@` TauhJ "iޣ.5F7˕ciEܲP]jeXRq}lM> %nccRg%J Uu(2#i4zZ>vsO|euX\i5Qm n3wUɶqi(bB(ED·dC3>JëWW"؎](tkk@2-%ry=7 b5ΖH(Ut7#.BLrFDD1)[t*€1 WHx$}3p2SȲ [;[0<Ʀ(t1>C"G&'#."WjӁk3M"q逭 rjJ[evϨLib tDl)۶!+,F&'òuՆ֠L81gU0L:#kWZłh 8w6Wa[vERrQ2BǦu8lN;eTfH` \l&z78!5(w x.DQy`K:DQ!͖*)%̄FLeu4D_JZNݰmKw-7ΖddHeZL9"LɪI)ئsǙ3 5hJ Q$)YY#)'R~j⺭+Ś->7"rΫEn@J&eU AzG-]=Rʋ+S 66cߓw[dJP'o`IJʊymrz*A}@YlkO몜Ak~Ύ`#pH&'#&IJIV?I&' ^yUFv@੘]HijASssi"HG(ts,DcJ(_|cb U}t crVxEmN eڰ,^Tpe/J$._:;\ VБD|6%&os[7҉T(f濸xV뀳݇Z+CB$\ 0ؖNeWKF1ə//;K]/Y\orVpCLNֲ%/qӐmB\b4O]< C!UVy:`4ߓl&3 sENB&E-2x5M*+4]ZjZ^P.1 Q"+.=i X 2jߝ@e}ݸrϿ5M@t_{;Nu+U1P5k/Cpf#jA˿+hy[ulooUC͎̑IENDB`Basenji/images/themes/Tango/48/text.png0000664000175000017500000000212112067326706020043 0ustar patrickpatrickPNG  IHDR00WsRGBbKGD pHYs B(xtIME!mIDAThXMR0d01nHaE]Ad9@ Aaڙnz$@N,p&1^3#Y ocY'Y[#c[s!@Dv~.>%brww[gϫOns3DԸ14Mqss G+D OOOH1!nW+mٵ c {{{H tŲ6Pe&L I ):6l1D El>Tnt:ҺΎP(WC#&l J1Gu?f 4:Eu o@d@QBU }rj,F9 s̀9S&`m jїɦv>??#"}-`0X Zy`>cwwW<,-\z0DR\prr"] 6>˥h '2ՠE''ISOD8==][7b@b2a‚$1q|8j&.Gǀ ( \bNb2h#?sbc*hˀZHLBmB64Ot:(Zs`4YٙZyTzX,SU?NBN4MїI P(0DEmlUEu49t@ʁ*tLsƀ*+yAD0v޸ 2`‚*Nr@fu\BFr&dAÀ92`;l,oLlijP* At:6"bu^ lel !XM8rZb;/Jb*:؞$I[l6v}}1fM]8ι$w IXw|FQ ðCDouXqq<xɀTw [kA y('xv(rP{@IENDB`Basenji/images/themes/Tango/48/image.png0000664000175000017500000000373612067326706020156 0ustar patrickpatrickPNG  IHDR00WsRGBbKGD pHYs B(xtIME&7^IDAThMGU1;ulؒ!,ʙ $"qDBH8X'8&J$G@d۱ǻxw=]Uzggֻk}ҨkuzdOZFԩSn`4⧶L թW}6D^vmƘy(#cYE;v,Ǽ!r$ioJo8ۓ~񫷑BW4ƀmt~5ڠc̠O}Zٸf3]=gYRigJCFmA`0)ɀ 9PPZc #6#ĕ6e?蹉,KR)!B H JT=/ilz/@0QP{z69!Dfe%F 6|bC!;ܺpj*0qb>{# 1%c#@ 쑘#3[)*$}tzLt l"![spO[. gڌ*c$k"ȭ xXeW1]z%Jk=T3>%W`) cƀR I.VPodxXلAL XO)0KXdtӣK${P,(5Q*rRCgkB0Yӏ e('K#=twoVh/cVJJσ1Kb[3x@5XIJ>d~۪%]Z&+oFog*asXN2y/_*jJ<\JMf3SwqlCAr5Be`u`Y? ,AqSF)ڍWFk\L֔ d51Rhm%0<@ 0 yvjzMlbr*_{mF)(*:+0[f"pz"cο0ۓT+4Zmekp{] xs`a;qr=fh̀ G}<3Gi|pwF4fJ)M%$ʇ`UVGs4rkw;Mqhivz)Ax+VDQBظ 6=SG[U^Lr1AÍ6zwY(VAm iI$UK F^{iHi1=w~Is{rZ)EywJi-jXN^{8ʞ0{m64}3zR(tA]#wI% %F:UD(}ZG}ߧ뱾y؎%1zUC Ib:.I$ yڨ8ӯ~տ0Y(Vsc'D>)Q$J5jį`Kx Q(LwBDu 0|Iv[oyxI-jj9n7w,stv֯,ce+ uDQ$z||jLNڻ-Ζ}VQ!Yve f?y*)le )PY_da9vvv*:*Rk^ټEvs "s'1P$DFZDDfqPU2:ou XQRSYT^D@5PP㜓.E @i2J"e%$ >S;fA4LRP&)SؿK/,u(>ɹ^:7H|'___%־?sGrg hpy ڂjD"(BG6nn=}cHRX1Y'lxvg,| ,c~)wX\|zox A\d[*RTr0.B7uBwf/6jBh;O4^"b9-؀=BnIv΄K}&-δkݭ%gtX|%Js .:%n&!0`ˣf%rq'[NB% 8)틙q eIۻ|O_ݝz'J %gb!&[ZX8YoR NZ n6ˑ*j$TF׬A&O ҀDʥr1` Gjh-!zu9mhZBT@Զ`e2.%F]ɮIsZOY>oH l":ˏUMD* ,fcS4.T #d;jܑO“@5-%3o(مduME؀n,;fH̅ #7%тyMN.!"Q; e).IDp_خf~Sy, U7m]q/AnGPh(;HBk* >1Zk:9woW/H;,$,`i+/?nӺiB3@z B!Hko Dto:VOI&B? i3,Hdb+sD ^OJ ` @@ aDxJz_I@!{'~"Mn$~&1 +:Smsqjt8\]pC; `FzǶ `}\6h1"=CMdvJJl&IENDB`Basenji/images/themes/Tango/48/dialog-info.png0000664000175000017500000000625212067326706021260 0ustar patrickpatrickPNG  IHDR00WsRGBbKGD pHYs B(xtIME#hL7h *IDAThZkUufc`UNǵ'4UȍTVj?6]?bBÖI-Ml!!l/ s_X14Bmc`-}:[^}k}k}k;hڹs'N񗉂OtQ^pǻw ;wgk_w&Lp[fͥKV gLcGlR<^L7[W:zGlB X#tC&a'}9T5kͩ3'gzcq;_!xe4>SLY@ 1ZHcܒRM#朼 g=1;A_6~n{6B '*L`P 39@BH9pN`xM6δGzhT?t\؆?#W }Mܵ)$|f8[8b9"8"rI_{Jf* |;ǎs[7g._jAܳfW&@3qNt<0`ŀH0D``̤"sP=?nfSrϥ2bƯw-]󕾑ul ځDc"CG KD/28TB|% UARO-_v{ut3m6E3LkW\ADsf"͌944NJ8&i~G6=BOqt`\~!M߶mgYߘi_zW{/&zqBLV H,3 L")ߋO j3W\c[rQ3@^r{-zN"=N4 G3s̊b"4Eb#s+}3m7n!"*Ʉ@G$VvB4ibhh&j*戈bb&b0DLV 3^t vM` 2NL5 3̽nED@N,PDF+j;qV6-ˁ@a̚,1,1̅ DX3dE\E(ZBBVc@< pVd=Ԑ \gVL1kJYr)A(J(TD AD`BPeqQcd@ #C̚4CD+Oi&1 v䜳kl#@ ϙK (e| (dm9-3kb&X̤I2@PZS>;@)a'H&Vd@/zr.=;yӑvjmVJӥf)msͲՃ]ᄯ 1lC[LUB%–=mџ Q8NJ=O˻rm8{]nt՗ l:A|VNN6C[N~0ܗ-Gm,MG{?]'3RR*RGJqݙ7d틋~:vh;bܽ|Ũ4¸+[Qz&PS= t.gڶtr53xOC/) D@ u՞_O?ݧB #N}ddʥ=rYbULl#?ғR2Wm>|11i%tGO: HwwewE6U;۷ݲ;nZ9k"m Bٞ ()Ly #_Q+P)t6/ZlNe*Gr=fjj͢bqIz˵+ኆr_9015] k4t%ȏ[ցK)cRN,ɞtDr]Qrt ԣ=ufK0QaIɀ.L KkV/Ce1;SH󟛜'};<4{+Qw] D;}-ȦoT$zbIx7g@V^e,S+N:U?Ҷny`hSۗ PN! K hxC"B6C:Ӈt-?bhX]G&{]~h(omYg 6 -]l6 `FYxզp̛^~+-dյc߼g!?C! RB_a:&њ[W&^} xwj?wc۱n gPQ)Q*qz9R"_a?wr ; k4ЂùXQj1p/ #wh63:T* LOQ.W۝CV]DyÆ 5+crp"4(l}}+ı D>|X_s!>d^v߾S{\.\/KX 70W\6<ܹ-=y<`̜ŕ `(}OV@ `y ,$}12R(㥏o07ox?lW߉\nSSpjom #-K@ȑ#?VC0 E1Ɣ=ߢYBM6ogdNA>>{q"chl~/+tZ-zsss]nh?+TT{" !044 B'b@'h!$ 3R'fzD$2Uvs ~'i)j~/Ggё@aBk "?;Rxz."5+@H7>NV4MeVVV`"ӣٻ߂#~q*['֓]]23*ZIDAThYMoG~ffwˉCBh ^RUDQS^*q?p`N=!Q@J`T6^lwُY'bvggywwfm9R!nn߾= EKUUiʯ[9Ji1iZ*~pHRK 8*RgB|%Kuud2^'T*5&I酅h4(`R(o+ a||=ׯ@%IO&ZBӴCJ=ZnN+++X,.޹s ?h U^C4Bĉi|v wnB^TVˈ&q L$|8}z604QUq) WK#]HB"1Dwwύl#9UF,qewl.갼HHD46M{Nb099M'-G'E_ XG,D|m[v(72W7<9 lP`^}\wBPZ-J;ބh b V ki "y`a1vp5v`*餌[t n2j{@i6?moo,:N}x)Ϸ0aV+O>bC_\wHN%p1 7ot:*@\T(u]1F,ː$ $AEA13o˶Υ*rݻ^r0 Q.]___*H\;DI hJ޽N@@+`7+j*,ˡ ^7kZg6VO>fQ^L) @h)NZ[C2 IENDB`Basenji/images/LED_Off.png0000664000175000017500000000022612067326706015471 0ustar patrickpatrickPNG  IHDR F pHYs  tIME 15kĂ5IDATcx!'!>&X image/svg+xml Media CD-ROM Jakub Steiner http://jimmac.musichall.cz cdrom media removable cd audio Basenji/custom_build_commands.sh0000775000175000017500000000166212067326706017236 0ustar patrickpatrick#!/bin/bash # script to perform custom build steps arg=$1 target_dir=$2 # gio-sharp is currenlty unstable and not installed into the GAC # so copy it localy gio_assembly_path="`pkg-config --variable=Libraries gio-sharp-2.0`" gio_assembly_name="`basename $gio_assembly_path`" case $arg in "--after-build") if [ ! -d $target_dir/data ]; then mkdir $target_dir/data cp -R images/basenji.svg images/themes $target_dir/data fi if [ ! -f $target_dir/$gio_assembly_name ]; then cp $gio_assembly_path $target_dir fi if [ ! -f $target_dir/$gio_assembly_name.config ]; then cp $gio_assembly_path.config $target_dir/ fi ;; "--after-clean") rm -rf $target_dir/data if [ -f $target_dir/$gio_assembly_name ]; then rm $target_dir/$gio_assembly_name fi if [ -f $target_dir/$gio_assembly_name.config ]; then rm $target_dir/$gio_assembly_name.config fi ;; *) echo "error: invalid argument." exit 1 esac Basenji/custom-hooks.make0000664000175000017500000000225312067326706015614 0ustar patrickpatrick# patch src/App.cs to load themes and icons from prefix/share/basenji APP_CS=$(srcdir)/src/App.cs $(eval $(call emit-deploy-wrapper, APP_CS, $(srcdir)/src/App.cs)) post-install-local-hook: # copy themes and icons into prefix/share/basenji if [ ! -d $(DESTDIR)$(datadir)/$(PACKAGE) ]; then \ mkdir -p $(DESTDIR)$(datadir)/$(PACKAGE); \ fi; \ cp -R $(BUILD_DIR)/data/* $(DESTDIR)$(datadir)/$(PACKAGE); \ \ gio_assembly_path="`pkg-config --variable=Libraries gio-sharp-2.0`"; \ cp "$$gio_assembly_path" $(DESTDIR)$(libdir)/$(PACKAGE); \ cp "$$gio_assembly_path.config" -n $(DESTDIR)$(libdir)/$(PACKAGE); post-uninstall-local-hook: # remove prefix/share/basenji if [ -d $(DESTDIR)$(datadir)/$(PACKAGE) ]; then \ rm -rf $(DESTDIR)$(datadir)/$(PACKAGE); \ fi; \ \ gio_assembly_path="`pkg-config --variable=Libraries gio-sharp-2.0`"; \ gio_assembly_name="`basename $$gio_assembly_path`"; \ if [ -f $(DESTDIR)$(libdir)/$(PACKAGE)/"$$gio_assembly_name" ]; then \ rm $(DESTDIR)$(libdir)/$(PACKAGE)/"$$gio_assembly_name"; \ fi; \ if [ -f $(DESTDIR)$(libdir)/$(PACKAGE)/"$$gio_assembly_name.config" ]; then \ rm $(DESTDIR)$(libdir)/$(PACKAGE)/"$$gio_assembly_name.config"; \ fi; Basenji/basenji0000775000175000017500000000355312067326706013667 0ustar patrickpatrick#!/bin/bash # Import GNOME 3 thumbnailers into GConf. # Workaround for bug lp:864615. # https://bugs.launchpad.net/ubuntu/+source/gconf2/+bug/864615 function check_thumbnailers() { THUMBNAILER_DIR=/usr/share/thumbnailers GCONF_PATH=/desktop/gnome/thumbnailers if [ $(gconftool-2 --all-dirs $GCONF_PATH | wc -l) -gt 0 ]; then # All good - thumbnailers are available in GConf return fi if [ ! -d $THUMBNAILER_DIR ]; then echo "Error: Can't import thumbnailers - directory '$THUMBNAILER_DIR' not found." return fi echo "Importing thumbnailers into GConf..." cnt=0 commands= mimetypes= for f in $(ls $THUMBNAILER_DIR); do echo "* Importing $f" cmd=$(grep -w Exec "$THUMBNAILER_DIR/$f" | cut -d '=' -f2) mimestr=$(grep -w MimeType "$THUMBNAILER_DIR/$f" | cut -d '=' -f2) for m in $( echo $mimestr | tr ";" "\n"); do commands[$cnt]=$cmd mimetypes[$cnt]=$(echo $m | tr "/" "@" | tr "+" "@") ((cnt++)) done done echo "* Writing to GConf" entries= for (( i = 0 ; i < ${#mimetypes[@]} ; i++ )); do read -d '' entry < ${mimetypes[$i]}/command /schemas$GCONF_PATH/${mimetypes[$i]}/command ${commands[$i]} ${mimetypes[$i]}/enable /schemas$GCONF_PATH/${mimetypes[$i]}/enable true EOF entries=$entries$entry done read -d '' xml < disable_all /schemas$GCONF_PATH/disable_all false $entries EOF echo $xml | gconftool-2 --load - echo "Done." } check_thumbnailers cd "@expanded_libdir@/@PACKAGE@" exec mono Basenji.exe "$@" Basenji.mds0000664000175000017500000000716412067326706013035 0ustar patrickpatrick Basenji_win32.sln0000664000175000017500000000555212067326706014067 0ustar patrickpatrick Microsoft Visual Studio Solution File, Format Version 11.00 # Visual Studio 2010 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Basenji_win32", "Basenji\Basenji_win32.csproj", "{9D64337F-0383-47B8-8CAB-D7B7C3FE143C}" EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "VolumeDB_win32", "VolumeDB\VolumeDB_win32.csproj", "{59B6E0D9-AF8C-40B1-A2F3-22C37503174C}" EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Platform_win32", "Platform\Platform_win32.csproj", "{A8624816-6F0F-42EC-96AE-84C001272CD8}" EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Platform.Common.DB_win32", "Platform.Common.DB\Platform.Common.DB_win32.csproj", "{6F73D36A-FBE3-410A-8976-00FC87A085CF}" EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MusicBrainz_win32", "MusicBrainz\MusicBrainz_win32.csproj", "{E0C813A2-FCEF-472F-9FE5-DC0CECF8E8B2}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU Release|Any CPU = Release|Any CPU EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution {9D64337F-0383-47B8-8CAB-D7B7C3FE143C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {9D64337F-0383-47B8-8CAB-D7B7C3FE143C}.Debug|Any CPU.Build.0 = Debug|Any CPU {9D64337F-0383-47B8-8CAB-D7B7C3FE143C}.Release|Any CPU.ActiveCfg = Release|Any CPU {9D64337F-0383-47B8-8CAB-D7B7C3FE143C}.Release|Any CPU.Build.0 = Release|Any CPU {59B6E0D9-AF8C-40B1-A2F3-22C37503174C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {59B6E0D9-AF8C-40B1-A2F3-22C37503174C}.Debug|Any CPU.Build.0 = Debug|Any CPU {59B6E0D9-AF8C-40B1-A2F3-22C37503174C}.Release|Any CPU.ActiveCfg = Release|Any CPU {59B6E0D9-AF8C-40B1-A2F3-22C37503174C}.Release|Any CPU.Build.0 = Release|Any CPU {A8624816-6F0F-42EC-96AE-84C001272CD8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {A8624816-6F0F-42EC-96AE-84C001272CD8}.Debug|Any CPU.Build.0 = Debug|Any CPU {A8624816-6F0F-42EC-96AE-84C001272CD8}.Release|Any CPU.ActiveCfg = Release|Any CPU {A8624816-6F0F-42EC-96AE-84C001272CD8}.Release|Any CPU.Build.0 = Release|Any CPU {6F73D36A-FBE3-410A-8976-00FC87A085CF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {6F73D36A-FBE3-410A-8976-00FC87A085CF}.Debug|Any CPU.Build.0 = Debug|Any CPU {6F73D36A-FBE3-410A-8976-00FC87A085CF}.Release|Any CPU.ActiveCfg = Release|Any CPU {6F73D36A-FBE3-410A-8976-00FC87A085CF}.Release|Any CPU.Build.0 = Release|Any CPU {E0C813A2-FCEF-472F-9FE5-DC0CECF8E8B2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {E0C813A2-FCEF-472F-9FE5-DC0CECF8E8B2}.Debug|Any CPU.Build.0 = Debug|Any CPU {E0C813A2-FCEF-472F-9FE5-DC0CECF8E8B2}.Release|Any CPU.ActiveCfg = Release|Any CPU {E0C813A2-FCEF-472F-9FE5-DC0CECF8E8B2}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE EndGlobalSection EndGlobal configure0000775000175000017500000000654012067326706012661 0ustar patrickpatrick#!/bin/bash VERSION=0.1 PACKAGE=basenji prefix=/usr/local config=GNOME_RELEASE configurations=" DEBUG RELEASE GNOME_DEBUG GNOME_RELEASE" common_packages=" dbus-sharp-1.0;0.7.0 dbus-sharp-glib-1.0;0.5.0 glib-sharp-2.0;2.12.10 gtk-sharp-2.0;2.12.10 taglib-sharp;2.0.4.0" usage () { echo "Usage : configure [OPTION]... [--config=CONFIG]" echo echo "Options:" echo " --prefix=PREFIX install architecture-independent files in PREFIX" echo " [/usr/local]" echo " --bindir=DIR user executables [PREFIX/bin]" echo " --datadir=DIR read-only architecture-independent data [PREFIX/share]" echo " --libdir=DIR object code libraries [PREFIX/lib]" echo echo "Configurations available :" for c in $configurations; do if [ "$c" = "$config" ]; then echo " $c (Default)" else echo " $c" fi done } validate_config () { test -z "$1" && return 0 for c in $configurations; do if [ "$c" = "$1" ]; then return 1 fi done return 0 } check_package () { name=`echo $1 | cut -d\; -f1` version=`echo $1 | cut -d\; -f2` echo -n "Checking for package '$name'.." | tee -a config.log pkg-config --atleast-version=$version $name if [ $? -ne 0 ]; then echo " ERROR: Package named '$name' >= $version not found." | tee -a config.log echo "Try adjusting your PKG_CONFIG_PATH environment variable." | tee -a config.log return 1 fi echo " found." | tee -a config.log } check_required_packages () { echo "Looking for required packages" | tee config.log var=required_packages_$config for pkg in $common_packages ${!var}; do check_package $pkg retval=$? [ $retval -ne 0 ] && return $retval done return 0 } while test x$1 != x; do case $1 in --prefix=*) prefix=`echo $1 | sed 's/--prefix=//'` ;; --prefix) shift prefix=$1 ;; --libdir=*) libdir=`echo $1 | sed 's/--libdir=//'` ;; --libdir) shift libdir=$1 ;; --bindir=*) bindir=`echo $1 | sed 's/--bindir=//'` ;; --bindir) shift bindir=$1 ;; --datadir=*) datadir=`echo $1 | sed 's/--datadir=//'` ;; --datadir) shift datadir=$1 ;; --config=*) conf=`echo $1 | sed 's/--config=//'` validate_config "$conf" if [ $? -eq 1 ]; then config=$conf else echo "Invalid config name - $conf" usage exit 1 fi ;; --help) usage exit ;; *) echo Unknown argument $1 >&2 usage exit 1 ;; esac shift done check_required_packages [ $? -eq 1 ] && exit 1 if [ -z "$libdir" ]; then libdir=$prefix/lib fi if [ -z "$bindir" ]; then bindir=$prefix/bin fi if [ -z "$datadir" ]; then datadir=$prefix/share fi echo "prefix=$prefix" > config.make echo "libdir=$libdir" >> config.make echo "bindir=$bindir" >> config.make echo "datadir=$datadir" >> config.make echo "RUNTIME=mono" >> config.make echo "ASSEMBLY_VERSION=$VERSION.0.0" >> config.make echo "VERSION=$VERSION" >> config.make echo "PACKAGE=$PACKAGE" >> config.make echo "CONFIG=$config" >> config.make echo echo "$PACKAGE has been configured with " echo " prefix = $prefix" if [ "$libdir" != "$prefix/lib" ]; then echo " libdir = $libdir" fi if [ "$bindir" != "$prefix/bin" ]; then echo " bindir = $bindir" fi if [ "$datadir" != "$prefix/share" ]; then echo " datadir = $datadir" fi echo " config = $config" echo COPYING0000664000175000017500000010451312067326706012004 0ustar patrickpatrick GNU GENERAL PUBLIC LICENSE Version 3, 29 June 2007 Copyright (C) 2007 Free Software Foundation, Inc. Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The GNU General Public License is a free, copyleft license for software and other kinds of works. The licenses for most software and other practical works are designed to take away your freedom to share and change the works. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change all versions of a program--to make sure it remains free software for all its users. We, the Free Software Foundation, use the GNU General Public License for most of our software; it applies also to any other work released this way by its authors. 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 them 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 prevent others from denying you these rights or asking you to surrender the rights. Therefore, you have certain responsibilities if you distribute copies of the software, or if you modify it: responsibilities to respect the freedom of others. For example, if you distribute copies of such a program, whether gratis or for a fee, you must pass on to the recipients the same freedoms that you received. 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. Developers that use the GNU GPL protect your rights with two steps: (1) assert copyright on the software, and (2) offer you this License giving you legal permission to copy, distribute and/or modify it. For the developers' and authors' protection, the GPL clearly explains that there is no warranty for this free software. For both users' and authors' sake, the GPL requires that modified versions be marked as changed, so that their problems will not be attributed erroneously to authors of previous versions. Some devices are designed to deny users access to install or run modified versions of the software inside them, although the manufacturer can do so. This is fundamentally incompatible with the aim of protecting users' freedom to change the software. The systematic pattern of such abuse occurs in the area of products for individuals to use, which is precisely where it is most unacceptable. Therefore, we have designed this version of the GPL to prohibit the practice for those products. If such problems arise substantially in other domains, we stand ready to extend this provision to those domains in future versions of the GPL, as needed to protect the freedom of users. Finally, every program is threatened constantly by software patents. States should not allow patents to restrict development and use of software on general-purpose computers, but in those that do, we wish to avoid the special danger that patents applied to a free program could make it effectively proprietary. To prevent this, the GPL assures that patents cannot be used to render the program non-free. The precise terms and conditions for copying, distribution and modification follow. TERMS AND CONDITIONS 0. Definitions. "This License" refers to version 3 of the GNU General Public License. "Copyright" also means copyright-like laws that apply to other kinds of works, such as semiconductor masks. "The Program" refers to any copyrightable work licensed under this License. Each licensee is addressed as "you". "Licensees" and "recipients" may be individuals or organizations. To "modify" a work means to copy from or adapt all or part of the work in a fashion requiring copyright permission, other than the making of an exact copy. The resulting work is called a "modified version" of the earlier work or a work "based on" the earlier work. A "covered work" means either the unmodified Program or a work based on the Program. To "propagate" a work means to do anything with it that, without permission, would make you directly or secondarily liable for infringement under applicable copyright law, except executing it on a computer or modifying a private copy. Propagation includes copying, distribution (with or without modification), making available to the public, and in some countries other activities as well. To "convey" a work means any kind of propagation that enables other parties to make or receive copies. Mere interaction with a user through a computer network, with no transfer of a copy, is not conveying. An interactive user interface displays "Appropriate Legal Notices" to the extent that it includes a convenient and prominently visible feature that (1) displays an appropriate copyright notice, and (2) tells the user that there is no warranty for the work (except to the extent that warranties are provided), that licensees may convey the work under this License, and how to view a copy of this License. If the interface presents a list of user commands or options, such as a menu, a prominent item in the list meets this criterion. 1. Source Code. The "source code" for a work means the preferred form of the work for making modifications to it. "Object code" means any non-source form of a work. A "Standard Interface" means an interface that either is an official standard defined by a recognized standards body, or, in the case of interfaces specified for a particular programming language, one that is widely used among developers working in that language. The "System Libraries" of an executable work include anything, other than the work as a whole, that (a) is included in the normal form of packaging a Major Component, but which is not part of that Major Component, and (b) serves only to enable use of the work with that Major Component, or to implement a Standard Interface for which an implementation is available to the public in source code form. A "Major Component", in this context, means a major essential component (kernel, window system, and so on) of the specific operating system (if any) on which the executable work runs, or a compiler used to produce the work, or an object code interpreter used to run it. The "Corresponding Source" for a work in object code form means all the source code needed to generate, install, and (for an executable work) run the object code and to modify the work, including scripts to control those activities. However, it does not include the work's System Libraries, or general-purpose tools or generally available free programs which are used unmodified in performing those activities but which are not part of the work. For example, Corresponding Source includes interface definition files associated with source files for the work, and the source code for shared libraries and dynamically linked subprograms that the work is specifically designed to require, such as by intimate data communication or control flow between those subprograms and other parts of the work. The Corresponding Source need not include anything that users can regenerate automatically from other parts of the Corresponding Source. The Corresponding Source for a work in source code form is that same work. 2. Basic Permissions. All rights granted under this License are granted for the term of copyright on the Program, and are irrevocable provided the stated conditions are met. This License explicitly affirms your unlimited permission to run the unmodified Program. The output from running a covered work is covered by this License only if the output, given its content, constitutes a covered work. This License acknowledges your rights of fair use or other equivalent, as provided by copyright law. You may make, run and propagate covered works that you do not convey, without conditions so long as your license otherwise remains in force. You may convey covered works to others for the sole purpose of having them make modifications exclusively for you, or provide you with facilities for running those works, provided that you comply with the terms of this License in conveying all material for which you do not control copyright. Those thus making or running the covered works for you must do so exclusively on your behalf, under your direction and control, on terms that prohibit them from making any copies of your copyrighted material outside their relationship with you. Conveying under any other circumstances is permitted solely under the conditions stated below. Sublicensing is not allowed; section 10 makes it unnecessary. 3. Protecting Users' Legal Rights From Anti-Circumvention Law. No covered work shall be deemed part of an effective technological measure under any applicable law fulfilling obligations under article 11 of the WIPO copyright treaty adopted on 20 December 1996, or similar laws prohibiting or restricting circumvention of such measures. When you convey a covered work, you waive any legal power to forbid circumvention of technological measures to the extent such circumvention is effected by exercising rights under this License with respect to the covered work, and you disclaim any intention to limit operation or modification of the work as a means of enforcing, against the work's users, your or third parties' legal rights to forbid circumvention of technological measures. 4. Conveying Verbatim Copies. You may convey 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; keep intact all notices stating that this License and any non-permissive terms added in accord with section 7 apply to the code; keep intact all notices of the absence of any warranty; and give all recipients a copy of this License along with the Program. You may charge any price or no price for each copy that you convey, and you may offer support or warranty protection for a fee. 5. Conveying Modified Source Versions. You may convey a work based on the Program, or the modifications to produce it from the Program, in the form of source code under the terms of section 4, provided that you also meet all of these conditions: a) The work must carry prominent notices stating that you modified it, and giving a relevant date. b) The work must carry prominent notices stating that it is released under this License and any conditions added under section 7. This requirement modifies the requirement in section 4 to "keep intact all notices". c) You must license the entire work, as a whole, under this License to anyone who comes into possession of a copy. This License will therefore apply, along with any applicable section 7 additional terms, to the whole of the work, and all its parts, regardless of how they are packaged. This License gives no permission to license the work in any other way, but it does not invalidate such permission if you have separately received it. d) If the work has interactive user interfaces, each must display Appropriate Legal Notices; however, if the Program has interactive interfaces that do not display Appropriate Legal Notices, your work need not make them do so. A compilation of a covered work with other separate and independent works, which are not by their nature extensions of the covered work, and which are not combined with it such as to form a larger program, in or on a volume of a storage or distribution medium, is called an "aggregate" if the compilation and its resulting copyright are not used to limit the access or legal rights of the compilation's users beyond what the individual works permit. Inclusion of a covered work in an aggregate does not cause this License to apply to the other parts of the aggregate. 6. Conveying Non-Source Forms. You may convey a covered work in object code form under the terms of sections 4 and 5, provided that you also convey the machine-readable Corresponding Source under the terms of this License, in one of these ways: a) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by the Corresponding Source fixed on a durable physical medium customarily used for software interchange. b) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by a written offer, valid for at least three years and valid for as long as you offer spare parts or customer support for that product model, to give anyone who possesses the object code either (1) a copy of the Corresponding Source for all the software in the product that is covered by this License, on a durable physical medium customarily used for software interchange, for a price no more than your reasonable cost of physically performing this conveying of source, or (2) access to copy the Corresponding Source from a network server at no charge. c) Convey individual copies of the object code with a copy of the written offer to provide the Corresponding Source. This alternative is allowed only occasionally and noncommercially, and only if you received the object code with such an offer, in accord with subsection 6b. d) Convey the object code by offering access from a designated place (gratis or for a charge), and offer equivalent access to the Corresponding Source in the same way through the same place at no further charge. You need not require recipients to copy the Corresponding Source along with the object code. If the place to copy the object code is a network server, the Corresponding Source may be on a different server (operated by you or a third party) that supports equivalent copying facilities, provided you maintain clear directions next to the object code saying where to find the Corresponding Source. Regardless of what server hosts the Corresponding Source, you remain obligated to ensure that it is available for as long as needed to satisfy these requirements. e) Convey the object code using peer-to-peer transmission, provided you inform other peers where the object code and Corresponding Source of the work are being offered to the general public at no charge under subsection 6d. A separable portion of the object code, whose source code is excluded from the Corresponding Source as a System Library, need not be included in conveying the object code work. A "User Product" is either (1) a "consumer product", which means any tangible personal property which is normally used for personal, family, or household purposes, or (2) anything designed or sold for incorporation into a dwelling. In determining whether a product is a consumer product, doubtful cases shall be resolved in favor of coverage. For a particular product received by a particular user, "normally used" refers to a typical or common use of that class of product, regardless of the status of the particular user or of the way in which the particular user actually uses, or expects or is expected to use, the product. A product is a consumer product regardless of whether the product has substantial commercial, industrial or non-consumer uses, unless such uses represent the only significant mode of use of the product. "Installation Information" for a User Product means any methods, procedures, authorization keys, or other information required to install and execute modified versions of a covered work in that User Product from a modified version of its Corresponding Source. The information must suffice to ensure that the continued functioning of the modified object code is in no case prevented or interfered with solely because modification has been made. If you convey an object code work under this section in, or with, or specifically for use in, a User Product, and the conveying occurs as part of a transaction in which the right of possession and use of the User Product is transferred to the recipient in perpetuity or for a fixed term (regardless of how the transaction is characterized), the Corresponding Source conveyed under this section must be accompanied by the Installation Information. But this requirement does not apply if neither you nor any third party retains the ability to install modified object code on the User Product (for example, the work has been installed in ROM). The requirement to provide Installation Information does not include a requirement to continue to provide support service, warranty, or updates for a work that has been modified or installed by the recipient, or for the User Product in which it has been modified or installed. Access to a network may be denied when the modification itself materially and adversely affects the operation of the network or violates the rules and protocols for communication across the network. Corresponding Source conveyed, and Installation Information provided, in accord with this section must be in a format that is publicly documented (and with an implementation available to the public in source code form), and must require no special password or key for unpacking, reading or copying. 7. Additional Terms. "Additional permissions" are terms that supplement the terms of this License by making exceptions from one or more of its conditions. Additional permissions that are applicable to the entire Program shall be treated as though they were included in this License, to the extent that they are valid under applicable law. If additional permissions apply only to part of the Program, that part may be used separately under those permissions, but the entire Program remains governed by this License without regard to the additional permissions. When you convey a copy of a covered work, you may at your option remove any additional permissions from that copy, or from any part of it. (Additional permissions may be written to require their own removal in certain cases when you modify the work.) You may place additional permissions on material, added by you to a covered work, for which you have or can give appropriate copyright permission. Notwithstanding any other provision of this License, for material you add to a covered work, you may (if authorized by the copyright holders of that material) supplement the terms of this License with terms: a) Disclaiming warranty or limiting liability differently from the terms of sections 15 and 16 of this License; or b) Requiring preservation of specified reasonable legal notices or author attributions in that material or in the Appropriate Legal Notices displayed by works containing it; or c) Prohibiting misrepresentation of the origin of that material, or requiring that modified versions of such material be marked in reasonable ways as different from the original version; or d) Limiting the use for publicity purposes of names of licensors or authors of the material; or e) Declining to grant rights under trademark law for use of some trade names, trademarks, or service marks; or f) Requiring indemnification of licensors and authors of that material by anyone who conveys the material (or modified versions of it) with contractual assumptions of liability to the recipient, for any liability that these contractual assumptions directly impose on those licensors and authors. All other non-permissive additional terms are considered "further restrictions" within the meaning of section 10. If the Program as you received it, or any part of it, contains a notice stating that it is governed by this License along with a term that is a further restriction, you may remove that term. If a license document contains a further restriction but permits relicensing or conveying under this License, you may add to a covered work material governed by the terms of that license document, provided that the further restriction does not survive such relicensing or conveying. If you add terms to a covered work in accord with this section, you must place, in the relevant source files, a statement of the additional terms that apply to those files, or a notice indicating where to find the applicable terms. Additional terms, permissive or non-permissive, may be stated in the form of a separately written license, or stated as exceptions; the above requirements apply either way. 8. Termination. You may not propagate or modify a covered work except as expressly provided under this License. Any attempt otherwise to propagate or modify it is void, and will automatically terminate your rights under this License (including any patent licenses granted under the third paragraph of section 11). However, if you cease all violation of this License, then your license from a particular copyright holder is reinstated (a) provisionally, unless and until the copyright holder explicitly and finally terminates your license, and (b) permanently, if the copyright holder fails to notify you of the violation by some reasonable means prior to 60 days after the cessation. Moreover, your license from a particular copyright holder is reinstated permanently if the copyright holder notifies you of the violation by some reasonable means, this is the first time you have received notice of violation of this License (for any work) from that copyright holder, and you cure the violation prior to 30 days after your receipt of the notice. Termination of your rights under this section does not terminate the licenses of parties who have received copies or rights from you under this License. If your rights have been terminated and not permanently reinstated, you do not qualify to receive new licenses for the same material under section 10. 9. Acceptance Not Required for Having Copies. You are not required to accept this License in order to receive or run a copy of the Program. Ancillary propagation of a covered work occurring solely as a consequence of using peer-to-peer transmission to receive a copy likewise does not require acceptance. However, nothing other than this License grants you permission to propagate or modify any covered work. These actions infringe copyright if you do not accept this License. Therefore, by modifying or propagating a covered work, you indicate your acceptance of this License to do so. 10. Automatic Licensing of Downstream Recipients. Each time you convey a covered work, the recipient automatically receives a license from the original licensors, to run, modify and propagate that work, subject to this License. You are not responsible for enforcing compliance by third parties with this License. An "entity transaction" is a transaction transferring control of an organization, or substantially all assets of one, or subdividing an organization, or merging organizations. If propagation of a covered work results from an entity transaction, each party to that transaction who receives a copy of the work also receives whatever licenses to the work the party's predecessor in interest had or could give under the previous paragraph, plus a right to possession of the Corresponding Source of the work from the predecessor in interest, if the predecessor has it or can get it with reasonable efforts. You may not impose any further restrictions on the exercise of the rights granted or affirmed under this License. For example, you may not impose a license fee, royalty, or other charge for exercise of rights granted under this License, and you may not initiate litigation (including a cross-claim or counterclaim in a lawsuit) alleging that any patent claim is infringed by making, using, selling, offering for sale, or importing the Program or any portion of it. 11. Patents. A "contributor" is a copyright holder who authorizes use under this License of the Program or a work on which the Program is based. The work thus licensed is called the contributor's "contributor version". A contributor's "essential patent claims" are all patent claims owned or controlled by the contributor, whether already acquired or hereafter acquired, that would be infringed by some manner, permitted by this License, of making, using, or selling its contributor version, but do not include claims that would be infringed only as a consequence of further modification of the contributor version. For purposes of this definition, "control" includes the right to grant patent sublicenses in a manner consistent with the requirements of this License. Each contributor grants you a non-exclusive, worldwide, royalty-free patent license under the contributor's essential patent claims, to make, use, sell, offer for sale, import and otherwise run, modify and propagate the contents of its contributor version. In the following three paragraphs, a "patent license" is any express agreement or commitment, however denominated, not to enforce a patent (such as an express permission to practice a patent or covenant not to sue for patent infringement). To "grant" such a patent license to a party means to make such an agreement or commitment not to enforce a patent against the party. If you convey a covered work, knowingly relying on a patent license, and the Corresponding Source of the work is not available for anyone to copy, free of charge and under the terms of this License, through a publicly available network server or other readily accessible means, then you must either (1) cause the Corresponding Source to be so available, or (2) arrange to deprive yourself of the benefit of the patent license for this particular work, or (3) arrange, in a manner consistent with the requirements of this License, to extend the patent license to downstream recipients. "Knowingly relying" means you have actual knowledge that, but for the patent license, your conveying the covered work in a country, or your recipient's use of the covered work in a country, would infringe one or more identifiable patents in that country that you have reason to believe are valid. If, pursuant to or in connection with a single transaction or arrangement, you convey, or propagate by procuring conveyance of, a covered work, and grant a patent license to some of the parties receiving the covered work authorizing them to use, propagate, modify or convey a specific copy of the covered work, then the patent license you grant is automatically extended to all recipients of the covered work and works based on it. A patent license is "discriminatory" if it does not include within the scope of its coverage, prohibits the exercise of, or is conditioned on the non-exercise of one or more of the rights that are specifically granted under this License. You may not convey a covered work if you are a party to an arrangement with a third party that is in the business of distributing software, under which you make payment to the third party based on the extent of your activity of conveying the work, and under which the third party grants, to any of the parties who would receive the covered work from you, a discriminatory patent license (a) in connection with copies of the covered work conveyed by you (or copies made from those copies), or (b) primarily for and in connection with specific products or compilations that contain the covered work, unless you entered into that arrangement, or that patent license was granted, prior to 28 March 2007. Nothing in this License shall be construed as excluding or limiting any implied license or other defenses to infringement that may otherwise be available to you under applicable patent law. 12. No Surrender of Others' Freedom. If 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 convey a covered work so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not convey it at all. For example, if you agree to terms that obligate you to collect a royalty for further conveying from those to whom you convey the Program, the only way you could satisfy both those terms and this License would be to refrain entirely from conveying the Program. 13. Use with the GNU Affero General Public License. Notwithstanding any other provision of this License, you have permission to link or combine any covered work with a work licensed under version 3 of the GNU Affero General Public License into a single combined work, and to convey the resulting work. The terms of this License will continue to apply to the part which is the covered work, but the special requirements of the GNU Affero General Public License, section 13, concerning interaction through a network will apply to the combination as such. 14. Revised Versions of this License. The Free Software Foundation may publish revised and/or new versions of the GNU 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 that a certain numbered version of the GNU General Public License "or any later version" applies to it, you have the option of following the terms and conditions either of that numbered version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of the GNU General Public License, you may choose any version ever published by the Free Software Foundation. If the Program specifies that a proxy can decide which future versions of the GNU General Public License can be used, that proxy's public statement of acceptance of a version permanently authorizes you to choose that version for the Program. Later license versions may give you additional or different permissions. However, no additional obligations are imposed on any author or copyright holder as a result of your choosing to follow a later version. 15. Disclaimer of Warranty. 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. 16. Limitation of Liability. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS 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. 17. Interpretation of Sections 15 and 16. If the disclaimer of warranty and limitation of liability provided above cannot be given local legal effect according to their terms, reviewing courts shall apply local law that most closely approximates an absolute waiver of all civil liability in connection with the Program, unless a warranty or assumption of liability accompanies a copy of the Program in return for a fee. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively state the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . Also add information on how to contact you by electronic and paper mail. If the program does terminal interaction, make it output a short notice like this when it starts in an interactive mode: Copyright (C) This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, your program's commands might be different; for a GUI interface, you would use an "about box". You should also get your employer (if you work as a programmer) or school, if any, to sign a "copyright disclaimer" for the program, if necessary. For more information on this, and how to apply and follow the GNU GPL, see . The GNU General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Lesser General Public License instead of this License. But first, please read . gen_po_templates0000775000175000017500000000072412067326706014223 0ustar patrickpatrick#!/bin/bash # extracts strings from *.cs files and # generates gettext .pot templates # for Basenji and VolumeDB. keyword="S._" generate_pot() { dirname=${PWD##*/} pot_name=./po/$dirname.pot if [ ! -d ./po ]; then mkdir ./po fi if [ -f $pot_name ]; then rm $pot_name fi find -iname *.cs | xgettext --language=C# --from-code=UTF-8 --keyword=$keyword --output=$pot_name --files-from=- } cd ./Basenji generate_pot cd .. cd ./VolumeDB generate_pot cd .. gen_translations0000775000175000017500000000051112067326706014242 0ustar patrickpatrick#!/bin/bash # generates translated string resources # for Basenji and VolumeDB. keyword="S._" generate_resources() { cd ./po rm *.resources 2> /dev/null for po in *.po; do msgfmt --csharp-resources -o ${po%.po}.resources $po done cd .. } cd ./Basenji generate_resources cd .. cd ./VolumeDB generate_resources cd .. Makefile0000664000175000017500000000445412067326706012414 0ustar patrickpatrick EXTRA_DIST = rules.make configure Makefile.include all: all-recursive top_srcdir=. include $(top_srcdir)/config.make include $(top_srcdir)/Makefile.include include $(top_srcdir)/rules.make #include $(top_srcdir)/custom-hooks.make #Warning: This is an automatically generated file, do not edit! ifeq ($(CONFIG),DEBUG) SUBDIRS = Platform Platform.Common.DB MusicBrainz VolumeDB Basenji endif ifeq ($(CONFIG),RELEASE) SUBDIRS = Platform Platform.Common.DB MusicBrainz VolumeDB Basenji endif ifeq ($(CONFIG),GNOME_DEBUG) SUBDIRS = Platform Platform.Common.DB MusicBrainz VolumeDB Basenji endif ifeq ($(CONFIG),GNOME_RELEASE) SUBDIRS = Platform Platform.Common.DB MusicBrainz VolumeDB Basenji endif CONFIG_MAKE=$(top_srcdir)/config.make %-recursive: $(CONFIG_MAKE) @set . $$MAKEFLAGS; final_exit=:; \ case $$2 in --unix) shift ;; esac; \ case $$2 in *=*) dk="exit 1" ;; *k*) dk=: ;; *) dk="exit 1" ;; esac; \ make pre-$*-hook prefix=$(prefix) ; \ for dir in $(call quote_each,$(SUBDIRS)); do \ case "$$dir" in \ .) make $*-local || { final_exit="exit 1"; $$dk; };;\ *) (cd "$$dir" && make $*) || { final_exit="exit 1"; $$dk; };;\ esac \ done; \ make post-$*-hook prefix=$(prefix) ; \ $$final_exit $(CONFIG_MAKE): echo "You must run configure first" exit 1 clean: clean-recursive install: install-recursive uninstall: uninstall-recursive dist: $(CONFIG_MAKE) rm -rf $(PACKAGE)-$(VERSION) mkdir $(PACKAGE)-$(VERSION) make pre-dist-hook distdir=$$distdir for dir in $(call quote_each,$(SUBDIRS)); do \ pkgdir=`pwd`/$(PACKAGE)-$(VERSION); \ mkdir "$$pkgdir/$$dir" || true; \ case $$dir in \ .) make dist-local "distdir=$$pkgdir" || exit 1;; \ *) (cd "$$dir"; make dist-local "distdir=$$pkgdir/$$dir") || exit 1;; \ esac \ done (make dist-local distdir=$(PACKAGE)-$(VERSION)) make post-dist-hook "distsir=$$distdir" tar czvf $(PACKAGE)-$(VERSION).tar.gz $(PACKAGE)-$(VERSION) rm -rf $(PACKAGE)-$(VERSION) @echo "==========================================" @echo "$(PACKAGE)-$(VERSION) has been packaged > $(PACKAGE)-$(VERSION).tar.gz" @echo "==========================================" distcheck: dist (mkdir test; cd test; \ tar xzvf ../$(PACKAGE)-$(VERSION).tar.gz; cd $(PACKAGE)-$(VERSION); \ ./configure --prefix=$$(cd `pwd`/..; pwd); \ make && make install && make dist); rm -rf test Makefile.include0000664000175000017500000001577412067326706014045 0ustar patrickpatrickVALID_CULTURES = ar bg ca zh-CHS cs da de el en es fi fr he hu is it ja ko nl no pl pt ro ru hr sk sq sv th tr id uk be sl et lv lt fa vi hy eu mk af ka fo hi sw gu ta te kn mr gl kok ar-SA bg-BG ca-ES zh-TW cs-CZ da-DK de-DE el-GR en-US fi-FI fr-FR he-IL hu-HU is-IS it-IT ja-JP ko-KR nl-NL nb-NO pl-PL pt-BR ro-RO ru-RU hr-HR sk-SK sq-AL sv-SE th-TH tr-TR id-ID uk-UA be-BY sl-SI et-EE lv-LV lt-LT fa-IR vi-VN hy-AM eu-ES mk-MK af-ZA ka-GE fo-FO hi-IN sw-KE gu-IN ta-IN te-IN kn-IN mr-IN gl-ES kok-IN ar-IQ zh-CN de-CH en-GB es-MX fr-BE it-CH nl-BE nn-NO pt-PT sv-FI ar-EG zh-HK de-AT en-AU es-ES fr-CA ar-LY zh-SG de-LU en-CA es-GT fr-CH ar-DZ zh-MO en-NZ es-CR fr-LU ar-MA en-IE es-PA ar-TN en-ZA es-DO ar-OM es-VE ar-YE es-CO ar-SY es-PE ar-JO en-TT es-AR ar-LB en-ZW es-EC ar-KW en-PH es-CL ar-AE es-UY ar-BH es-PY ar-QA es-BO es-SV es-HN es-NI es-PR zh-CHT s2q=$(subst \ ,?,$1) q2s=$(subst ?,\ ,$1) # use this when result will be quoted unesc2=$(subst ?, ,$1) build_sources = $(FILES) $(GENERATED_FILES) build_sources_esc= $(call s2q,$(build_sources)) # use unesc2, as build_sources_embed is quoted build_sources_embed= $(call unesc2,$(build_sources_esc:%='$(srcdir)/%')) comma__=, get_resource_name = $(firstword $(subst $(comma__), ,$1)) get_culture = $(lastword $(subst ., ,$(basename $1))) is_cultured_resource = $(and $(word 3,$(subst ., ,$1)), $(filter $(VALID_CULTURES),$(lastword $(subst ., ,$(basename $1))))) RESOURCES_ESC=$(call s2q,$(RESOURCES)) build_resx_list = $(foreach res, $(RESOURCES_ESC), $(if $(filter %.resx, $(call get_resource_name,$(res))),$(res),)) build_non_culture_resx_list = $(foreach res, $(build_resx_list),$(if $(call is_cultured_resource,$(call get_resource_name,$(res))),,$(res))) build_non_culture_others_list = $(foreach res, $(filter-out $(build_resx_list),$(RESOURCES_ESC)),$(if $(call is_cultured_resource,$(call get_resource_name,$(res))),,$(res))) build_others_list = $(build_non_culture_others_list) build_xamlg_list = $(filter %.xaml.g.cs, $(FILES)) # resgen all .resx resources build_resx_files = $(foreach res, $(build_resx_list), $(call get_resource_name,$(res))) build_resx_resources_esc = $(build_resx_files:.resx=.resources) build_resx_resources = $(call q2s,$(build_resx_resources_esc)) # embed resources for the main assembly build_resx_resources_hack = $(subst .resx,.resources, $(build_non_culture_resx_list)) # use unesc2, as build_resx_resources_embed is quoted build_resx_resources_embed = $(call unesc2,$(build_resx_resources_hack:%='-resource:%')) build_others_files = $(call q2s,$(foreach res, $(build_others_list),$(call get_resource_name,$(res)))) build_others_resources = $(build_others_files) # use unesc2, as build_others_resources_embed is quoted build_others_resources_embed = $(call unesc2,$(build_others_list:%='-resource:$(srcdir)/%')) build_resources = $(build_resx_resources) $(build_others_resources) build_resources_embed = $(build_resx_resources_embed) $(build_others_resources_embed) # -usesourcepath is available only for resgen2 emit_resgen_target_1=$(call q2s,$1) : $(call q2s,$(subst .resources,.resx,$1)); cd '$$(shell dirname '$$<')' && MONO_IOMAP=drive $$(RESGEN) '$$(shell basename '$$<')' '$$(shell basename '$$@')' emit_resgen_target_2=$(call q2s,$1) : $(call q2s,$(subst .resources,.resx,$1)); MONO_IOMAP=drive $$(RESGEN) -usesourcepath '$$<' '$$@' emit_resgen_target=$(if $(filter resgen2,$(RESGEN)),$(emit_resgen_target_2),$(emit_resgen_target_1)) emit_resgen_targets=$(foreach res,$(build_resx_resources_esc),$(eval $(call emit_resgen_target,$(res)))) build_references_ref = $(call q2s,$(foreach ref, $(call s2q,$(REFERENCES)), $(if $(filter -pkg:%, $(ref)), $(ref), $(if $(filter -r:%, $(ref)), $(ref), -r:$(ref))))) build_references_ref += $(call q2s,$(foreach ref, $(call s2q,$(DLL_REFERENCES)), -r:$(ref))) build_references_ref += $(call q2s,$(foreach ref, $(call s2q,$(PROJECT_REFERENCES)), -r:$(ref))) s2q2s=$(call unesc2,$(call s2q,$1)) cp_actual=test -z $1 || cp $1 $2 cp=$(call cp_actual,'$(call s2q2s,$1)','$(call s2q2s,$2)') rm_actual=test -z '$1' || rm -f '$2' rm=$(call rm_actual,$(call s2q2s,$1),$(call s2q2s,$2)/$(shell basename '$(call s2q2s,$1)')) EXTRA_DIST += $(build_sources) $(build_resx_files) $(build_others_files) $(ASSEMBLY_WRAPPER_IN) $(EXTRAS) $(DATA_FILES) $(build_culture_res_files) CLEANFILES += $(ASSEMBLY) $(ASSEMBLY).mdb $(BINARIES) $(build_resx_resources) $(build_satellite_assembly_list) DISTCLEANFILES = $(GENERATED_FILES) $(pc_files) $(BUILD_DIR)/* programfilesdir = $(pkglibdir) programfiles_DATA = $(ASSEMBLY) bin_SCRIPTS = $(BINARIES) linuxdesktopapplicationsdir = @datadir@/applications linuxdesktopapplications_DATA = $(LINUX_DESKTOPAPPLICATIONS) programfilesdir = @libdir@/@PACKAGE@ programfiles_DATA = $(PROGRAMFILES) linuxpkgconfigdir = @libdir@/pkgconfig linuxpkgconfig_DATA = $(LINUX_PKGCONFIG) # macros # $(call emit-deploy-target,deploy-variable-name) define emit-deploy-target $($1): $($1_SOURCE) mkdir -p '$$(shell dirname '$$@')' cp '$$<' '$$@' endef # $(call emit-deploy-wrapper,wrapper-variable-name,wrapper-sourcefile,x) # assumes that for a wrapper foo.pc its source template is foo.pc.in # if $3 is non-empty then wrapper is marked exec define emit-deploy-wrapper $($1): $2 $(top_srcdir)/config.make mkdir -p '$$(shell dirname '$$@')' cp '$$<' '$$@' $(if $3,chmod +x '$$@') $2: $2.in $(top_srcdir)/config.make sed -e "s,@prefix@,$(prefix)," -e "s,@PACKAGE@,$(PACKAGE)," -e "s,@expanded_libdir@,$(libdir)," -e "s,@expanded_bindir@,$(bindir)," -e "s,@expanded_datadir@,$(datadir)," < $2.in > $2 endef # generating satellite assemblies culture_resources = $(foreach res, $(RESOURCES_ESC), $(if $(call is_cultured_resource,$(call get_resource_name, $(res))),$(res))) cultures = $(sort $(foreach res, $(culture_resources), $(call get_culture,$(call get_resource_name,$(res))))) culture_resource_dependencies = $(call q2s,$(BUILD_DIR)/$1/$(SATELLITE_ASSEMBLY_NAME): $(subst .resx,.resources,$2)) culture_resource_commandlines = $(call unesc2,cmd_line_satellite_$1 += '/embed:$(subst .resx,.resources,$2)') build_satellite_assembly_list = $(call q2s,$(cultures:%=$(BUILD_DIR)/%/$(SATELLITE_ASSEMBLY_NAME))) build_culture_res_files = $(call q2s,$(foreach res, $(culture_resources),$(call get_resource_name,$(res)))) install_satellite_assembly_list = $(subst $(BUILD_DIR),$(DESTDIR)$(libdir)/$(PACKAGE),$(build_satellite_assembly_list)) $(eval $(foreach res, $(culture_resources), $(eval $(call culture_resource_dependencies,$(call get_culture,$(call get_resource_name,$(res))),$(call get_resource_name,$(res)))))) $(eval $(foreach res, $(culture_resources), $(eval $(call culture_resource_commandlines,$(call get_culture,$(call get_resource_name,$(res))),$(res))))) $(build_satellite_assembly_list): $(BUILD_DIR)/%/$(SATELLITE_ASSEMBLY_NAME): mkdir -p '$(@D)' $(AL) -out:'$@' -culture:$* -t:lib $(cmd_line_satellite_$*) $(install_satellite_assembly_list): mkdir -p '$(@D)' cp $(subst $(DESTDIR)$(libdir)/$(PACKAGE), $(BUILD_DIR), $@) $@ install-satellite-assemblies: $(install_satellite_assembly_list) uninstall-satellite-assemblies: rm -rf $(install_satellite_assembly_list)MusicBrainz/0000775000175000017500000000000012067326706013173 5ustar patrickpatrickMusicBrainz/MusicBrainz_win32.csproj0000664000175000017500000001115512067326706017670 0ustar patrickpatrick Debug AnyCPU 9.0.30729 2.0 {E0C813A2-FCEF-472F-9FE5-DC0CECF8E8B2} Library Properties MusicBrainz MusicBrainz v4.0 512 3.5 http://localhost/MusicBrainz/ true Web true Foreground 7 Days false false true 0 1.0.0.%2a true false true true full false bin\Debug\ DEBUG;TRACE prompt 4 true AllRules.ruleset pdbonly true bin\Release\ TRACE prompt 4 true AllRules.ruleset False .NET Framework 3.5 SP1 Client Profile false False .NET Framework 3.5 SP1 true False Windows Installer 3.1 true MusicBrainz/MusicBrainz.mdp0000664000175000017500000000611112067326706016122 0ustar patrickpatrick MusicBrainz/Makefile0000664000175000017500000000756612067326706014651 0ustar patrickpatrick EXTRA_DIST = Makefile # Warning: This is an automatically generated file, do not edit! srcdir=. top_srcdir=.. include $(top_srcdir)/config.make ifeq ($(CONFIG),DEBUG) ASSEMBLY_COMPILER_COMMAND = dmcs ASSEMBLY_COMPILER_FLAGS = -noconfig -codepage:utf8 -unsafe -warn:4 -optimize- -debug "-define:DEBUG" ASSEMBLY = bin/Debug/MusicBrainz.dll ASSEMBLY_MDB = $(ASSEMBLY).mdb COMPILE_TARGET = library PROJECT_REFERENCES = BUILD_DIR = bin/Debug MUSICBRAINZ_DLL_MDB_SOURCE=bin/Debug/MusicBrainz.dll.mdb MUSICBRAINZ_DLL_MDB=$(BUILD_DIR)/MusicBrainz.dll.mdb endif ifeq ($(CONFIG),RELEASE) ASSEMBLY_COMPILER_COMMAND = dmcs ASSEMBLY_COMPILER_FLAGS = -noconfig -codepage:utf8 -unsafe -warn:4 -optimize+ ASSEMBLY = bin/Release/MusicBrainz.dll ASSEMBLY_MDB = COMPILE_TARGET = library PROJECT_REFERENCES = BUILD_DIR = bin/Release MUSICBRAINZ_DLL_MDB= endif ifeq ($(CONFIG),GNOME_DEBUG) ASSEMBLY_COMPILER_COMMAND = dmcs ASSEMBLY_COMPILER_FLAGS = -noconfig -codepage:utf8 -unsafe -warn:4 -optimize- -debug "-define:DEBUG" ASSEMBLY = bin/Debug/MusicBrainz.dll ASSEMBLY_MDB = $(ASSEMBLY).mdb COMPILE_TARGET = library PROJECT_REFERENCES = BUILD_DIR = bin/Debug MUSICBRAINZ_DLL_MDB_SOURCE=bin/Debug/MusicBrainz.dll.mdb MUSICBRAINZ_DLL_MDB=$(BUILD_DIR)/MusicBrainz.dll.mdb endif ifeq ($(CONFIG),GNOME_RELEASE) ASSEMBLY_COMPILER_COMMAND = dmcs ASSEMBLY_COMPILER_FLAGS = -noconfig -codepage:utf8 -unsafe -warn:4 -optimize+ ASSEMBLY = bin/Release/MusicBrainz.dll ASSEMBLY_MDB = COMPILE_TARGET = library PROJECT_REFERENCES = BUILD_DIR = bin/Release MUSICBRAINZ_DLL_MDB= endif AL=al SATELLITE_ASSEMBLY_NAME=$(notdir $(basename $(ASSEMBLY))).resources.dll PROGRAMFILES = \ $(MUSICBRAINZ_DLL_MDB) RESGEN=resgen2 FILES = \ src/Artist.cs \ src/AssemblyInfo.cs \ src/Disc.cs \ src/DiscLinux.cs \ src/DiscWin32.cs \ src/Event.cs \ src/Label.cs \ src/LocalDisc.cs \ src/MusicBrainzEntity.cs \ src/MusicBrainzException.cs \ src/MusicBrainzItem.cs \ src/MusicBrainzObject.cs \ src/MusicBrainzService.cs \ src/Query.cs \ src/Relation.cs \ src/Release.cs \ src/Track.cs \ src/Utils.cs \ src/XmlRequestEventArgs.cs \ src/DiscWin32NT.cs DATA_FILES = RESOURCES = EXTRAS = REFERENCES = \ System \ System.Xml DLL_REFERENCES = CLEANFILES = $(PROGRAMFILES) #Targets all: $(ASSEMBLY) $(PROGRAMFILES) $(top_srcdir)/config.make include $(top_srcdir)/Makefile.include #include $(srcdir)/custom-hooks.make $(eval $(call emit_resgen_targets)) $(build_xamlg_list): %.xaml.g.cs: %.xaml xamlg '$<' $(ASSEMBLY_MDB): $(ASSEMBLY) $(ASSEMBLY): $(build_sources) $(build_resources) $(build_datafiles) $(DLL_REFERENCES) $(PROJECT_REFERENCES) $(build_xamlg_list) $(build_satellite_assembly_list) make pre-all-local-hook prefix=$(prefix) mkdir -p $(shell dirname $(ASSEMBLY)) make $(CONFIG)_BeforeBuild $(ASSEMBLY_COMPILER_COMMAND) $(ASSEMBLY_COMPILER_FLAGS) -out:$(ASSEMBLY) -target:$(COMPILE_TARGET) $(build_sources_embed) $(build_resources_embed) $(build_references_ref) make $(CONFIG)_AfterBuild make post-all-local-hook prefix=$(prefix) install-local: $(ASSEMBLY) $(ASSEMBLY_MDB) make pre-install-local-hook prefix=$(prefix) make install-satellite-assemblies prefix=$(prefix) mkdir -p '$(DESTDIR)$(libdir)/$(PACKAGE)' $(call cp,$(ASSEMBLY),$(DESTDIR)$(libdir)/$(PACKAGE)) $(call cp,$(ASSEMBLY_MDB),$(DESTDIR)$(libdir)/$(PACKAGE)) $(call cp,$(MUSICBRAINZ_DLL_MDB),$(DESTDIR)$(libdir)/$(PACKAGE)) make post-install-local-hook prefix=$(prefix) uninstall-local: $(ASSEMBLY) $(ASSEMBLY_MDB) make pre-uninstall-local-hook prefix=$(prefix) make uninstall-satellite-assemblies prefix=$(prefix) $(call rm,$(ASSEMBLY),$(DESTDIR)$(libdir)/$(PACKAGE)) $(call rm,$(ASSEMBLY_MDB),$(DESTDIR)$(libdir)/$(PACKAGE)) $(call rm,$(MUSICBRAINZ_DLL_MDB),$(DESTDIR)$(libdir)/$(PACKAGE)) make post-uninstall-local-hook prefix=$(prefix) install: install-local uninstall: uninstall-local clean: clean-local include $(top_srcdir)/rules.make MusicBrainz/src/0000775000175000017500000000000012067326706013762 5ustar patrickpatrickMusicBrainz/src/MusicBrainzService.cs0000664000175000017500000000412412067326706020061 0ustar patrickpatrick// MusicBrainzService.cs // // Copyright (c) 2008 Scott Peterson // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. using System; using System.Net.Cache; namespace MusicBrainz { public static class MusicBrainzService { static Uri service_url = new Uri (@"http://musicbrainz.org/ws/1/"); public static Uri ServiceUrl { get { return service_url; } set { if (value == null) throw new ArgumentNullException ("value"); service_url = value; } } static RequestCachePolicy cache_policy; public static RequestCachePolicy CachePolicy { get { return cache_policy; } set { cache_policy = value; } } public static event EventHandler XmlRequest; internal static void OnXmlRequest (string url, bool fromCache) { EventHandler handler = XmlRequest; if (handler != null) handler (null, new XmlRequestEventArgs (new Uri (url), fromCache)); } } } MusicBrainz/src/MusicBrainzEntity.cs0000664000175000017500000001165412067326706017743 0ustar patrickpatrick// MusicBrainzEntity.cs // // Copyright (c) 2008 Scott Peterson // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. using System; using System.Collections.Generic; using System.Collections.ObjectModel; using System.Text; using System.Xml; namespace MusicBrainz { // A person-like entity, such as an artist or a label. public abstract class MusicBrainzEntity : MusicBrainzObject { #region Private string name; string sort_name; string disambiguation; string begin_date; string end_date; ReadOnlyCollection aliases; #endregion #region Constructors internal MusicBrainzEntity (string id, string parameters) : base (id, parameters) { } internal MusicBrainzEntity (XmlReader reader, bool all_rels_loaded) : base (reader, all_rels_loaded) { } #endregion #region Protected internal override void CreateIncCore (StringBuilder builder) { if (aliases == null) AppendIncParameters (builder, "aliases"); base.CreateIncCore (builder); } internal void LoadMissingDataCore (MusicBrainzEntity entity) { name = entity.GetName (); sort_name = entity.GetSortName (); disambiguation = entity.GetDisambiguation (); begin_date = entity.GetBeginDate (); end_date = entity.GetEndDate (); if (aliases == null) aliases = entity.GetAliases (); base.LoadMissingDataCore (entity); } internal override void ProcessXmlCore (XmlReader reader) { switch (reader.Name) { case "name": name = reader.ReadString (); break; case "sort-name": sort_name = reader.ReadString (); break; case "disambiguation": disambiguation = reader.ReadString (); break; case "life-span": begin_date = reader ["begin"]; end_date = reader ["end"]; break; case "alias-list": if (reader.ReadToDescendant ("alias")) { List aliases = new List (); do aliases.Add (reader.ReadString ()); while (reader.ReadToNextSibling ("alias")); this.aliases = aliases.AsReadOnly (); } break; default: base.ProcessXmlCore (reader); break; } } internal static string CreateNameParameter (string name) { StringBuilder builder = new StringBuilder (name.Length + 6); builder.Append ("&name="); Utils.PercentEncode (builder, name); return builder.ToString (); } #endregion #region Public public virtual string GetName () { return GetPropertyOrNull (ref name); } [Queryable ("sortname")] public virtual string GetSortName () { return GetPropertyOrNull (ref sort_name); } [Queryable ("comment")] public virtual string GetDisambiguation () { return GetPropertyOrNull (ref disambiguation); } [Queryable ("begin")] public virtual string GetBeginDate () { return GetPropertyOrNull (ref begin_date); } [Queryable ("end")] public virtual string GetEndDate () { return GetPropertyOrNull (ref end_date); } [QueryableMember ("Contains", "alias")] public virtual ReadOnlyCollection GetAliases () { return GetPropertyOrNew (ref aliases); } public override string ToString () { return name; } #endregion } } MusicBrainz/src/Artist.cs0000664000175000017500000002052512067326706015563 0ustar patrickpatrick// Artist.cs // // Copyright (c) 2008 Scott Peterson // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. using System; using System.Collections.Generic; using System.Collections.ObjectModel; using System.Text; using System.Xml; namespace MusicBrainz { public sealed class Artist : MusicBrainzEntity { #region Private const string EXTENSION = "artist"; ArtistReleaseType artist_release_type = DefaultArtistReleaseType; ArtistType? type; ReadOnlyCollection releases; bool have_all_releases; #endregion #region Constructors Artist (string id) : base (id, null) { } Artist (string id, ArtistReleaseType artist_release_type) : base (id, "&inc=" + artist_release_type.ToString ()) { have_all_releases = true; this.artist_release_type = artist_release_type; } internal Artist (XmlReader reader) : base (reader, false) { } #endregion #region Protected internal override string UrlExtension { get { return EXTENSION; } } internal override void CreateIncCore (StringBuilder builder) { AppendIncParameters (builder, artist_release_type.ToString ()); base.CreateIncCore (builder); } internal override void LoadMissingDataCore () { Artist artist = new Artist (Id); type = artist.GetArtistType (); base.LoadMissingDataCore (artist); } internal override void ProcessAttributes (XmlReader reader) { switch (reader ["type"]) { case "Group": type = ArtistType.Group; break; case "Person": type = ArtistType.Person; break; } } internal override void ProcessXmlCore (XmlReader reader) { switch (reader.Name) { case "release-list": if (reader.ReadToDescendant ("release")) { List releases = new List (); do releases.Add (new Release (reader.ReadSubtree ())); while (reader.ReadToNextSibling ("release")); this.releases = releases.AsReadOnly (); } break; default: base.ProcessXmlCore (reader); break; } } #endregion #region Public static ArtistReleaseType default_artist_release_type = new ArtistReleaseType (ReleaseStatus.Official, ReleaseArtistType.SingleArtist); public static ArtistReleaseType DefaultArtistReleaseType { get { return default_artist_release_type; } set { if (value == null) throw new ArgumentNullException ("value"); default_artist_release_type = value; } } public ArtistReleaseType ArtistReleaseType { get { return artist_release_type; } set { if (artist_release_type == value) { return; } artist_release_type = value; releases = null; have_all_releases = false; } } [Queryable ("arid")] public override string Id { get { return base.Id; } } [Queryable ("artist")] public override string GetName () { return base.GetName (); } [Queryable ("artype")] public ArtistType GetArtistType () { return GetPropertyOrDefault (ref type, ArtistType.Unknown); } public ReadOnlyCollection GetReleases () { return releases ?? (have_all_releases ? releases = new ReadOnlyCollection (new Release [0]) : new Artist (Id, ArtistReleaseType).GetReleases ()); } public ReadOnlyCollection GetReleases (ArtistReleaseType artistReleaseType) { return new Artist (Id, artistReleaseType).GetReleases (); } #endregion #region Static public static Artist Get (string id) { if (id == null) throw new ArgumentNullException ("id"); return new Artist (id); } public static Query Query (string name) { if (name == null) throw new ArgumentNullException ("name"); return new Query (EXTENSION, CreateNameParameter (name)); } public static Query QueryLucene (string luceneQuery) { if (luceneQuery == null) throw new ArgumentNullException ("luceneQuery"); return new Query (EXTENSION, CreateLuceneParameter (luceneQuery)); } public static implicit operator string (Artist artist) { return artist.ToString (); } #endregion } #region Ancillary Types public enum ArtistType { Unknown, Group, Person } public enum ReleaseArtistType { VariousArtists, SingleArtist } public sealed class ArtistReleaseType { string str; public ArtistReleaseType (ReleaseType type, ReleaseArtistType artistType) : this ((Enum)type, artistType) { } public ArtistReleaseType (ReleaseStatus status, ReleaseArtistType artistType) : this ((Enum)status, artistType) { } public ArtistReleaseType (ReleaseType type, ReleaseStatus status, ReleaseArtistType artistType) { StringBuilder builder = new StringBuilder (); Format (builder, type, artistType); builder.Append ('+'); Format (builder, status, artistType); str = builder.ToString (); } ArtistReleaseType (Enum enumeration, ReleaseArtistType artistType) { StringBuilder builder = new StringBuilder (); Format (builder, enumeration, artistType); str = builder.ToString (); } static void Format (StringBuilder builder, Enum enumeration, ReleaseArtistType artistType) { builder.Append (artistType == ReleaseArtistType.VariousArtists ? "va-" : "sa-"); Utils.EnumToString (builder, enumeration.ToString ()); } public override string ToString () { return str; } public override bool Equals (object o) { return this == o as ArtistReleaseType; } public static bool operator ==(ArtistReleaseType artistReleaseType1, ArtistReleaseType artistReleaseType2) { if (Object.ReferenceEquals (artistReleaseType1, null)) { return Object.ReferenceEquals (artistReleaseType2, null); } return !Object.ReferenceEquals (artistReleaseType2, null) && artistReleaseType1.str == artistReleaseType2.str; } public static bool operator !=(ArtistReleaseType artistReleaseType1, ArtistReleaseType artistReleaseType2) { return !(artistReleaseType1 == artistReleaseType2); } public override int GetHashCode () { return str.GetHashCode (); } } #endregion } MusicBrainz/src/DiscWin32NT.cs0000664000175000017500000001636712067326706016275 0ustar patrickpatrick// DiscWin32NT.cs // // Copyright (c) 2008 Scott Peterson // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. using System; using System.Runtime.InteropServices; using Microsoft.Win32.SafeHandles; namespace MusicBrainz { internal sealed class DiscWin32NT : LocalDisc { [DllImport ("kernel32.dll")] static extern bool DeviceIoControl (SafeFileHandle hDevice, uint dwIoControlCode, IntPtr lpInBuffer, uint nInBufferSize, IntPtr lpOutBuffer, uint nOutBufferSize, out uint lpBytesReturned, IntPtr lpOverlapped); [DllImport ("kernel32.dll")] static extern SafeFileHandle CreateFile (string lpFileName, uint dwDesiredAccess, uint dwShareMode, IntPtr SecurityAttributes, uint dwCreationDisposition, uint dwFlagsAndAttributes, IntPtr hTemplateFile); const uint GENERIC_READ = 0x80000000; const uint FILE_SHARE_READ = 0x00000001; const uint FILE_SHARE_WRITE = 0x00000002; const uint OPEN_EXISTING = 3; const uint IOCTL_CDROM_READ_TOC = 0x24000; const uint IOCTL_CDROM_GET_LAST_SESSION = 0x24038; const int XA_INTERVAL = ((60 + 90 + 2) * 75); [StructLayout (LayoutKind.Sequential)] struct TRACK_DATA { public byte Reserved; public byte ControlAndAdr; public byte TrackNumber; public byte Reserved1; public byte Address0; public byte Address1; public byte Address2; public byte Address3; public int GetSectors () { return Address1 * 4500 + Address2 * 75 + Address3; } } const int MAX_TRACK_NUMBER = 100; [StructLayout (LayoutKind.Sequential)] class CDROM_TOC { public ushort Length; public byte FirstTrack; public byte LastTrack; public TRACK_DATA_Array TrackData = new TRACK_DATA_Array(); public CDROM_TOC () { Length = (ushort)Marshal.SizeOf (this); } } [StructLayout (LayoutKind.Sequential)] class TRACK_DATA_Array { [MarshalAs (UnmanagedType.ByValArray, SizeConst = MAX_TRACK_NUMBER * 8)] byte[] TrackData = new byte[MAX_TRACK_NUMBER * Marshal.SizeOf (typeof (TRACK_DATA))]; public unsafe TRACK_DATA this[int index] { get { if (index < 0 || index >= MAX_TRACK_NUMBER) throw new IndexOutOfRangeException (); fixed (byte* b = TrackData) { TRACK_DATA* td = (TRACK_DATA*)b; td += index; return *td; } } } } [StructLayout (LayoutKind.Sequential)] class CDROM_TOC_SESSION_DATA { public ushort Length; public byte FirstCompleteSession; public byte LastCompleteSession; public TRACK_DATA TrackData; public CDROM_TOC_SESSION_DATA () { Length = (ushort)Marshal.SizeOf (this); } } internal DiscWin32NT (string device) { int colon = device.IndexOf (':'); if (colon == -1) { throw new ArgumentException ("The device path is not valid.", "device"); } string filename = string.Concat (@"\\.\", device.Substring (0, colon + 1)); CDROM_TOC_SESSION_DATA session = new CDROM_TOC_SESSION_DATA (); CDROM_TOC toc = new CDROM_TOC(); using (SafeFileHandle file = CreateFile (filename, GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, IntPtr.Zero, OPEN_EXISTING, 0, IntPtr.Zero)) { if (file.IsInvalid) { throw new LocalDiscException ("Could not open the CD device."); } uint returned; GCHandle session_handle = GCHandle.Alloc (session, GCHandleType.Pinned); try { bool result = DeviceIoControl (file, IOCTL_CDROM_GET_LAST_SESSION, IntPtr.Zero, 0, session_handle.AddrOfPinnedObject (), (uint)Marshal.SizeOf (session), out returned, IntPtr.Zero); if (!result) { throw new LocalDiscException ("There was a problem while reading the disc TOC."); } } finally { session_handle.Free (); } IntPtr toc_ptr = Marshal.AllocHGlobal (Marshal.SizeOf (toc)); Marshal.StructureToPtr (toc, toc_ptr, false); try { bool result = DeviceIoControl (file, IOCTL_CDROM_READ_TOC, IntPtr.Zero, 0, toc_ptr, (uint)Marshal.SizeOf (toc), out returned, IntPtr.Zero); if (!result) { throw new LocalDiscException ("There was a problem while reading the disc TOC."); } Marshal.PtrToStructure (toc_ptr, toc); } finally { Marshal.FreeHGlobal (toc_ptr); } } first_track = toc.FirstTrack; if (session.FirstCompleteSession != session.LastCompleteSession) { last_track = (byte)(session.TrackData.TrackNumber - 1); track_offsets[0] = toc.TrackData[last_track].GetSectors () - XA_INTERVAL; } else { last_track = toc.LastTrack; track_offsets[0] = toc.TrackData[last_track].GetSectors (); } for (int i = first_track; i <= last_track; i++) { track_offsets[i] = toc.TrackData[i - 1].GetSectors (); } Init (); } } }MusicBrainz/src/Disc.cs0000664000175000017500000000336112067326706015176 0ustar patrickpatrick// Disc.cs // // Copyright (c) 2008 Scott Peterson // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. using System; using System.Xml; namespace MusicBrainz { public class Disc { string id; int sectors; internal Disc () { } internal Disc (XmlReader reader) { reader.Read (); int.TryParse (reader ["sectors"], out sectors); id = reader ["id"]; reader.Close (); } public string Id { get { return id; } protected set { id = value; } } public int Sectors { get { return sectors; } protected set { sectors = value; } } } } MusicBrainz/src/MusicBrainzItem.cs0000664000175000017500000001243212067326706017360 0ustar patrickpatrick// MusicBrainzItem.cs // // Copyright (c) 2008 Scott Peterson // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. using System; using System.Text; using System.Xml; namespace MusicBrainz { // The item-like product of an artist, such as a track or a release. public abstract class MusicBrainzItem : MusicBrainzObject { #region Private string title; Artist artist; #endregion #region Constructors internal MusicBrainzItem (string id) : base (id, null) { } internal MusicBrainzItem (XmlReader reader, Artist artist, bool all_rels_loaded) : base (reader, all_rels_loaded) { if (this.artist == null) this.artist = artist; } #endregion #region Protected Overrides internal override void CreateIncCore (StringBuilder builder) { if (artist == null) AppendIncParameters(builder, "artist"); base.CreateIncCore (builder); } internal void LoadMissingDataCore (MusicBrainzItem item) { title = item.GetTitle (); if (artist == null) artist = item.GetArtist (); base.LoadMissingDataCore (item); } internal override void ProcessXmlCore (XmlReader reader) { switch (reader.Name) { case "title": title = reader.ReadString (); break; case "artist": artist = new Artist (reader.ReadSubtree ()); break; default: base.ProcessXmlCore (reader); break; } } #endregion #region Public public virtual string GetTitle () { return GetPropertyOrNull (ref title); } [Queryable ("artist")] public virtual Artist GetArtist () { return GetPropertyOrNull (ref artist); } public override string ToString () { return title; } #endregion } #region Ancillary Types public abstract class ItemQueryParameters { internal ItemQueryParameters () { } string title; public string Title { get { return title; } set { title = value; } } string artist; public string Artist { get { return artist; } set { artist = value; } } string artist_id; public string ArtistId { get { return artist_id; } set { artist_id = value; } } ReleaseType? release_type; public ReleaseType? ReleaseType { get { return release_type; } set { release_type = value; } } ReleaseStatus? release_status; public ReleaseStatus? ReleaseStatus { get { return release_status; } set { release_status = value; } } int? count; public int? TrackCount { get { return count; } set { count = value; } } internal abstract void ToStringCore (StringBuilder builder); public override string ToString () { StringBuilder builder = new StringBuilder (); ToStringCore (builder); if (title != null) { builder.Append ("&title="); Utils.PercentEncode (builder, title); } if (artist != null) { builder.Append ("&artist="); Utils.PercentEncode (builder, artist); } if (artist_id != null) { builder.Append ("&artistid="); builder.Append (artist_id); } if (release_type != null) { builder.Append ("&releasetypes="); builder.Append (Utils.EnumToString (release_type.Value)); } if (release_status != null) { builder.Append (release_type != null ? "+" : "&releasetypes="); builder.Append (release_status); } if (count != null) { builder.Append ("&count="); builder.Append (count.Value); } return builder.ToString (); } } #endregion } MusicBrainz/src/Utils.cs0000664000175000017500000000557212067326706015422 0ustar patrickpatrick// Utils.cs // // Copyright (c) 2008 Scott Peterson // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. using System; using System.Text; namespace MusicBrainz { internal static class Utils { public static string EnumToString (Enum enumeration) { string str = enumeration.ToString (); StringBuilder builder = new StringBuilder (str.Length); EnumToString (builder, str); return builder.ToString (); } public static void EnumToString (StringBuilder builder, string str) { builder.Append (str [0]); for (int i = 1; i < str.Length; i++) { if (str [i] >= 'A' && str [i] <= 'Z') builder.Append ('-'); builder.Append (str [i]); } } public static T StringToEnum (string name) where T : struct { return StringToEnumOrNull (name) ?? default (T); } public static T? StringToEnumOrNull (string name) where T : struct { if (name != null) foreach (T value in Enum.GetValues (typeof (T))) if (Enum.GetName (typeof (T), value) == name) return value; return null; } public static void PercentEncode (StringBuilder builder, string value) { foreach (char c in value) { if ((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z') || (c >= '0' && c <= '9') || c == '-' || c == '_' || c == '.' || c == '~') builder.Append (c); else { builder.Append ('%'); foreach (byte b in Encoding.UTF8.GetBytes (new char [] { c })) builder.AppendFormat ("{0:X}", b); } } } } } MusicBrainz/src/MusicBrainzObject.cs0000664000175000017500000004201112067326706017664 0ustar patrickpatrick// MusicBrainzObject.cs // // Copyright (c) 2008 Scott Peterson // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. using System; using System.Collections.Generic; using System.Collections.ObjectModel; using System.IO; using System.Net; using System.Reflection; using System.Text; using System.Threading; using System.Xml; namespace MusicBrainz { public abstract class MusicBrainzObject { #region Private Fields static DateTime last_accessed; static readonly TimeSpan min_interval = new TimeSpan (0, 0, 1); // 1 second static readonly object server_mutex = new object (); static readonly string [] rels_params = new string [] { "artist-rels", "release-rels", "track-rels", "label-rels", "url-rels" }; bool all_data_loaded; bool all_rels_loaded; string id; byte score; ReadOnlyCollection> artist_rels; ReadOnlyCollection> release_rels; ReadOnlyCollection> track_rels; ReadOnlyCollection> label_rels; ReadOnlyCollection url_rels; #endregion #region Constructors internal MusicBrainzObject (string id, string parameters) { all_data_loaded = true; CreateFromId (id, parameters ?? CreateInc ()); } internal MusicBrainzObject (XmlReader reader, bool all_rels_loaded) { this.all_rels_loaded = all_rels_loaded; CreateFromXml (reader); } #endregion #region Private Methods string CreateInc () { StringBuilder builder = new StringBuilder (); CreateIncCore (builder); return builder.ToString (); } void CreateFromId (string id, string parameters) { XmlProcessingClosure ( CreateUrl (UrlExtension, id, parameters), delegate (XmlReader reader) { reader.ReadToFollowing ("metadata"); reader.Read (); CreateFromXml (reader.ReadSubtree ()); reader.Close (); } ); } void CreateFromXml (XmlReader reader) { reader.Read (); id = reader ["id"]; byte.TryParse (reader ["ext:score"], out score); ProcessAttributes (reader); while (reader.Read () && reader.NodeType != XmlNodeType.EndElement) { if (reader.Name == "relation-list") { all_rels_loaded = true; switch (reader ["target-type"]) { case "Artist": artist_rels = CreateRelation (reader.ReadSubtree ()); break; case "Release": release_rels = CreateRelation (reader.ReadSubtree ()); break; case "Track": track_rels = CreateRelation (reader.ReadSubtree ()); break; case "Label": label_rels = CreateRelation

/// Summary description for ThumbnailCreator. /// internal class ThumbnailCreator : IDisposable { #region ShellFolder Enumerations [Flags] private enum ESTRRET : int { STRRET_WSTR = 0x0000, // Use STRRET.pOleStr STRRET_OFFSET = 0x0001, // Use STRRET.uOffset to Ansi STRRET_CSTR = 0x0002 // Use STRRET.cStr } [Flags] private enum ESHCONTF : int { SHCONTF_FOLDERS = 32, SHCONTF_NONFOLDERS = 64, SHCONTF_INCLUDEHIDDEN = 128 } [Flags] private enum ESHGDN : int { SHGDN_NORMAL = 0, SHGDN_INFOLDER = 1, SHGDN_FORADDRESSBAR = 16384, SHGDN_FORPARSING = 32768 } [Flags] private enum ESFGAO : int { SFGAO_CANCOPY = 1, SFGAO_CANMOVE = 2, SFGAO_CANLINK = 4, SFGAO_CANRENAME = 16, SFGAO_CANDELETE = 32, SFGAO_HASPROPSHEET = 64, SFGAO_DROPTARGET = 256, SFGAO_CAPABILITYMASK = 375, SFGAO_LINK = 65536, SFGAO_SHARE = 131072, SFGAO_READONLY = 262144, SFGAO_GHOSTED = 524288, SFGAO_DISPLAYATTRMASK = 983040, SFGAO_FILESYSANCESTOR = 268435456, SFGAO_FOLDER = 536870912, SFGAO_FILESYSTEM = 1073741824, SFGAO_HASSUBFOLDER = -2147483648, SFGAO_CONTENTSMASK = -2147483648, SFGAO_VALIDATE = 16777216, SFGAO_REMOVABLE = 33554432, SFGAO_COMPRESSED = 67108864 } #endregion #region IExtractImage Enumerations private enum EIEIFLAG { IEIFLAG_ASYNC = 0x0001, // ask the extractor if it supports ASYNC extract (free threaded) IEIFLAG_CACHE = 0x0002, // returned from the extractor if it does NOT cache the thumbnail IEIFLAG_ASPECT = 0x0004, // passed to the extractor to beg it to render to the aspect ratio of the supplied rect IEIFLAG_OFFLINE = 0x0008, // if the extractor shouldn't hit the net to get any content neede for the rendering IEIFLAG_GLEAM = 0x0010, // does the image have a gleam ? this will be returned if it does IEIFLAG_SCREEN = 0x0020, // render as if for the screen (this is exlusive with IEIFLAG_ASPECT ) IEIFLAG_ORIGSIZE = 0x0040, // render to the approx size passed, but crop if neccessary IEIFLAG_NOSTAMP = 0x0080, // returned from the extractor if it does NOT want an icon stamp on the thumbnail IEIFLAG_NOBORDER = 0x0100, // returned from the extractor if it does NOT want an a border around the thumbnail IEIFLAG_QUALITY = 0x0200 // passed to the Extract method to indicate that a slower, higher quality image is desired, re-compute the thumbnail } #endregion #region ShellFolder Structures [StructLayoutAttribute(LayoutKind.Sequential, Pack=4, Size=0, CharSet=CharSet.Auto)] private struct STRRET_CSTR { public ESTRRET uType; [MarshalAs(System.Runtime.InteropServices.UnmanagedType.ByValArray, SizeConst=520)] public byte[] cStr; } [StructLayout(LayoutKind.Explicit, CharSet=CharSet.Auto)] private struct STRRET_ANY { [FieldOffset(0)] public ESTRRET uType; [FieldOffset(4)] public IntPtr pOLEString; } [StructLayoutAttribute(LayoutKind.Sequential)] private struct SIZE { public int cx; public int cy; } #endregion #region Com Interop for IUnknown [ComImport, Guid("00000000-0000-0000-C000-000000000046")] [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] private interface IUnknown { [PreserveSig] IntPtr QueryInterface(ref Guid riid, out IntPtr pVoid); [PreserveSig] IntPtr AddRef(); [PreserveSig] IntPtr Release(); } #endregion #region COM Interop for IMalloc [ComImportAttribute()] [GuidAttribute("00000002-0000-0000-C000-000000000046")] [InterfaceTypeAttribute(ComInterfaceType.InterfaceIsIUnknown)] //helpstring("IMalloc interface") private interface IMalloc { [PreserveSig] IntPtr Alloc(int cb); [PreserveSig] IntPtr Realloc( IntPtr pv, int cb); [PreserveSig] void Free(IntPtr pv); [PreserveSig] int GetSize(IntPtr pv); [PreserveSig] int DidAlloc(IntPtr pv); [PreserveSig] void HeapMinimize(); }; #endregion #region COM Interop for IEnumIDList [ComImportAttribute()] [GuidAttribute("000214F2-0000-0000-C000-000000000046")] [InterfaceTypeAttribute(ComInterfaceType.InterfaceIsIUnknown)] //helpstring("IEnumIDList interface") private interface IEnumIDList { [PreserveSig] int Next( int celt, ref IntPtr rgelt, out int pceltFetched); void Skip( int celt); void Reset(); void Clone( ref IEnumIDList ppenum); }; #endregion #region COM Interop for IShellFolder [ComImportAttribute()] [GuidAttribute("000214E6-0000-0000-C000-000000000046")] [InterfaceTypeAttribute(ComInterfaceType.InterfaceIsIUnknown)] //helpstring("IShellFolder interface") private interface IShellFolder { void ParseDisplayName( IntPtr hwndOwner, IntPtr pbcReserved, [MarshalAs(UnmanagedType.LPWStr)] string lpszDisplayName, out int pchEaten, out IntPtr ppidl, out int pdwAttributes); void EnumObjects( IntPtr hwndOwner, [MarshalAs(UnmanagedType.U4)] ESHCONTF grfFlags, ref IEnumIDList ppenumIDList ); void BindToObject( IntPtr pidl, IntPtr pbcReserved, ref Guid riid, ref IShellFolder ppvOut); void BindToStorage( IntPtr pidl, IntPtr pbcReserved, ref Guid riid, IntPtr ppvObj ); [PreserveSig] int CompareIDs( IntPtr lParam, IntPtr pidl1, IntPtr pidl2); void CreateViewObject( IntPtr hwndOwner, ref Guid riid, IntPtr ppvOut); void GetAttributesOf( int cidl, IntPtr apidl, [MarshalAs(UnmanagedType.U4)] ref ESFGAO rgfInOut); void GetUIObjectOf( IntPtr hwndOwner, int cidl, ref IntPtr apidl, ref Guid riid, out int prgfInOut, ref IUnknown ppvOut); void GetDisplayNameOf( IntPtr pidl, [MarshalAs(UnmanagedType.U4)] ESHGDN uFlags, ref STRRET_CSTR lpName); void SetNameOf( IntPtr hwndOwner, IntPtr pidl, [MarshalAs(UnmanagedType.LPWStr)] string lpszName, [MarshalAs(UnmanagedType.U4)] ESHCONTF uFlags, ref IntPtr ppidlOut); }; #endregion #region COM Interop for IExtractImage [ComImportAttribute()] [GuidAttribute("BB2E617C-0920-11d1-9A0B-00C04FC2D6C1")] [InterfaceTypeAttribute(ComInterfaceType.InterfaceIsIUnknown)] //helpstring("IExtractImage"), private interface IExtractImage { void GetLocation( [Out(), MarshalAs(UnmanagedType.LPWStr)] StringBuilder pszPathBuffer, int cch, ref int pdwPriority, ref SIZE prgSize, int dwRecClrDepth, ref int pdwFlags); void Extract( out IntPtr phBmpThumbnail); } #endregion #region UnManagedMethods for IShellFolder private class UnManagedMethods { [DllImport("shell32", CharSet = CharSet.Auto)] internal extern static int SHGetMalloc(out IMalloc ppMalloc); [DllImport("shell32", CharSet = CharSet.Auto)] internal extern static int SHGetDesktopFolder(out IShellFolder ppshf); [DllImport("shell32", CharSet = CharSet.Auto)] internal extern static int SHGetPathFromIDList ( IntPtr pidl, StringBuilder pszPath); [DllImport("gdi32", CharSet = CharSet.Auto)] internal extern static int DeleteObject ( IntPtr hObject ); } #endregion #region Member Variables private IMalloc alloc = null; private bool disposed = false; private System.Drawing.Size desiredSize = new System.Drawing.Size(100,100); private System.Drawing.Bitmap thumbNail = null; #endregion #region Implementation public System.Drawing.Bitmap ThumbNail { get { return thumbNail; } } public System.Drawing.Size DesiredSize { get { return desiredSize; } set { desiredSize = value; } } private IMalloc Allocator { get { if (!disposed) { if (alloc == null) { UnManagedMethods.SHGetMalloc(out alloc); } } else { System.Diagnostics.Debug.Assert(false, "Object has been disposed."); } return alloc; } } public System.Drawing.Bitmap GetThumbNail( string file ) { if ((!File.Exists(file)) && (!Directory.Exists(file))) { throw new FileNotFoundException( String.Format("The file '{0}' does not exist", file), file); } if (thumbNail != null) { thumbNail.Dispose(); thumbNail = null; } IShellFolder folder = null; try { folder = getDesktopFolder; } catch (Exception ex) { throw ex; } if (folder != null) { IntPtr pidlMain = IntPtr.Zero; try { int cParsed = 0; int pdwAttrib = 0; string filePath = Path.GetDirectoryName(file); pidlMain = IntPtr.Zero; folder.ParseDisplayName( IntPtr.Zero, IntPtr.Zero, filePath, out cParsed, out pidlMain, out pdwAttrib); } catch (Exception ex) { Marshal.ReleaseComObject(folder); throw ex; } if (pidlMain != IntPtr.Zero) { // IShellFolder: Guid iidShellFolder = new Guid("000214E6-0000-0000-C000-000000000046"); IShellFolder item = null; try { folder.BindToObject(pidlMain, IntPtr.Zero, ref iidShellFolder, ref item); } catch (Exception ex) { Marshal.ReleaseComObject(folder); Allocator.Free(pidlMain); throw ex; } if (item != null) { // IEnumIDList idEnum = null; try { item.EnumObjects( IntPtr.Zero, (ESHCONTF.SHCONTF_FOLDERS | ESHCONTF.SHCONTF_NONFOLDERS), ref idEnum); } catch (Exception ex) { Marshal.ReleaseComObject(folder); Allocator.Free(pidlMain); throw ex; } if (idEnum != null) { // start reading the enum: int hRes = 0; IntPtr pidl = IntPtr.Zero; int fetched = 0; bool complete = false; while (!complete) { hRes = idEnum.Next(1, ref pidl, out fetched); if (hRes != 0) { pidl = IntPtr.Zero; complete = true; } else { if (getThumbNail(file, pidl, item)) { complete = true; } } if (pidl != IntPtr.Zero) { Allocator.Free(pidl); } } Marshal.ReleaseComObject(idEnum); } Marshal.ReleaseComObject(item); } Allocator.Free(pidlMain); } Marshal.ReleaseComObject(folder); } return thumbNail; } private bool getThumbNail( string file, IntPtr pidl, IShellFolder item ) { IntPtr hBmp = IntPtr.Zero; IExtractImage extractImage = null; try { string pidlPath = PathFromPidl(pidl); if (Path.GetFileName(pidlPath).ToUpper().Equals(Path.GetFileName(file).ToUpper())) { // we have the item: IUnknown iunk = null; int prgf = 0; Guid iidExtractImage = new Guid("BB2E617C-0920-11d1-9A0B-00C04FC2D6C1"); item.GetUIObjectOf( IntPtr.Zero, 1, ref pidl, ref iidExtractImage, out prgf, ref iunk); extractImage = (IExtractImage)iunk; if (extractImage != null) { Console.WriteLine("Got an IExtractImage object!"); SIZE sz = new SIZE(); sz.cx = desiredSize.Width; sz.cy = desiredSize.Height; StringBuilder location = new StringBuilder(260, 260); int priority = 0; int requestedColourDepth = 32; EIEIFLAG flags = EIEIFLAG.IEIFLAG_ASPECT | EIEIFLAG.IEIFLAG_SCREEN; int uFlags = (int)flags; extractImage.GetLocation( location, location.Capacity, ref priority, ref sz, requestedColourDepth, ref uFlags); extractImage.Extract(out hBmp); if (hBmp != IntPtr.Zero) { // create the image object: thumbNail = System.Drawing.Bitmap.FromHbitmap(hBmp); // is thumbNail owned by the Bitmap? } Marshal.ReleaseComObject(extractImage); extractImage = null; } return true; } else { return false; } } catch (Exception ex) { if (hBmp != IntPtr.Zero) { UnManagedMethods.DeleteObject(hBmp); } if (extractImage != null) { Marshal.ReleaseComObject(extractImage); } throw ex; } } private string PathFromPidl( IntPtr pidl ) { StringBuilder path = new StringBuilder(260, 260); int result = UnManagedMethods.SHGetPathFromIDList(pidl, path); if (result == 0) { return string.Empty; } else { return path.ToString(); } } private IShellFolder getDesktopFolder { get { IShellFolder ppshf; int r = UnManagedMethods.SHGetDesktopFolder(out ppshf); return ppshf; } } #endregion #region Constructor, Destructor, Dispose public ThumbnailCreator() { } public void Dispose() { if (!disposed) { if (alloc != null) { Marshal.ReleaseComObject(alloc); } alloc = null; if (thumbNail != null) { thumbNail.Dispose(); } disposed = true; } } ~ThumbnailCreator() { Dispose(); } #endregion } #endregion } #endifPlatform/src/Win32/IO/0000775000175000017500000000000012067326706014531 5ustar patrickpatrickPlatform/src/Win32/IO/AudioCdWin32.cs0000664000175000017500000000722412067326706017220 0ustar patrickpatrick// AudioCdWin32.cs // // Copyright (C) 2010 Patrick Ulbrich // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // # if WIN32 using System; using System.IO; using System.Runtime.InteropServices; using Microsoft.Win32.SafeHandles; namespace Platform.Win32.IO { internal static class AudioCdWin32 { private const uint GENERIC_READ = 0x80000000; private const uint FILE_SHARE_READ = 0x00000001; private const uint FILE_SHARE_WRITE = 0x00000002; private const uint OPEN_EXISTING = 3; private const uint CDROM_DISK_AUDIO_TRACK = 0x00001; private const uint CDROM_DISK_DATA_TRACK = 0x00002; private const uint IOCTL_CDROM_DISK_TYPE = 0x20040; // GCHandle requires a reference type [StructLayout(LayoutKind.Sequential)] private class CDROM_DISK_DATA { public ulong DiskData; } public static bool IsAudioCd(string device) { int colon_idx = device.IndexOf(':'); if (colon_idx == -1) { throw new ArgumentException("Invalid device name", "device"); } string filename = string.Concat(@"\\.\", device.Substring(0, colon_idx + 1)); using (SafeFileHandle file = CreateFile(filename, GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, IntPtr.Zero, OPEN_EXISTING, 0, IntPtr.Zero)) { if (file.IsInvalid) throw new IOException("Opening the CD device failed."); uint ret; CDROM_DISK_DATA cdd = new CDROM_DISK_DATA(); GCHandle handle = GCHandle.Alloc(cdd, GCHandleType.Pinned); try { if (!DeviceIoControl(file, IOCTL_CDROM_DISK_TYPE, IntPtr.Zero, 0, handle.AddrOfPinnedObject(), (uint)Marshal.SizeOf(cdd), out ret, IntPtr.Zero)) throw new IOException("Error reading disk type"); } finally { handle.Free(); } return ((cdd.DiskData & 0x03) == CDROM_DISK_AUDIO_TRACK); } } [DllImport ("kernel32.dll")] private static extern bool DeviceIoControl(SafeFileHandle hDevice, uint dwIoControlCode, IntPtr lpInBuffer, uint nInBufferSize, IntPtr lpOutBuffer, uint nOutBufferSize, out uint lpBytesReturned, IntPtr lpOverlapped); [DllImport ("kernel32.dll")] private static extern SafeFileHandle CreateFile(string lpFileName, uint dwDesiredAccess, uint dwShareMode, IntPtr SecurityAttributes, uint dwCreationDisposition, uint dwFlagsAndAttributes, IntPtr hTemplateFile); } } #endifPlatform/src/Win32/IO/Win32DriveInfoProvider.cs0000664000175000017500000000601612067326706021306 0ustar patrickpatrick// Win32DriveInfoProvider.cs // // Copyright (C) 2011 Patrick Ulbrich // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // #if WIN32 using System; using System.Collections.Generic; using Platform.Common.IO; namespace Platform.Win32.IO { internal class Win32DriveInfoProvider : IDriveInfoProvider { public virtual void FromDevice(DriveInfo d, string device) { string rootPath = device; // FromPath() adds an ending slash ("d:\") FromPath(d, rootPath); // throws ArgumentException if drive cant be found } public virtual void FromPath(DriveInfo d, string rootPath) { if (!rootPath.EndsWith("\\")) // e.g. "D:" -> "D:\" rootPath += "\\"; // throws ArgumentException if drive can't be found System.IO.DriveInfo di = new System.IO.DriveInfo(rootPath); FillDriveInfo(d, di); } public virtual List GetAll(bool readyDrivesOnly) { List drives = new List(); System.IO.DriveInfo[] ioDrives = System.IO.DriveInfo.GetDrives(); foreach (System.IO.DriveInfo di in ioDrives) { if (!(readyDrivesOnly && !di.IsReady)) { DriveInfo d = new DriveInfo(); FillDriveInfo(d, di); drives.Add(d); } } return drives; } private static void FillDriveInfo(DriveInfo d, System.IO.DriveInfo di) { if (di.IsReady) { d.volumeLabel = di.VolumeLabel; d.totalSize = di.TotalSize; d.filesystem = di.DriveFormat; } d.rootPath = di.RootDirectory.FullName; // should return e.g. "D:", not "D:\" d.device = d.rootPath[d.rootPath.Length - 1] == System.IO.Path.DirectorySeparatorChar ? d.rootPath.Substring(0, d.rootPath.Length - 1) : d.rootPath; d.isMounted = true; d.isReady = di.IsReady; switch (di.DriveType) { case System.IO.DriveType.CDRom: d.driveType = DriveType.CDRom; if (d.isReady) d.hasAudioCdVolume = AudioCdWin32.IsAudioCd(d.device); break; case System.IO.DriveType.Fixed: d.driveType = DriveType.Fixed; break; case System.IO.DriveType.Network: d.driveType = DriveType.Network; break; case System.IO.DriveType.Ram: d.driveType = DriveType.Ram; break; case System.IO.DriveType.Removable: d.driveType = DriveType.Removable; break; case System.IO.DriveType.NoRootDirectory: d.driveType = DriveType.Unknown; d.isMounted = false; break; case System.IO.DriveType.Unknown: d.driveType = DriveType.Unknown; break; } } } } #endifPlatform/src/Win32/ThumbnailGenerator.cs0000664000175000017500000000412312067326706020343 0ustar patrickpatrick// ThumbnailGenerator.cs // // Copyright (C) 2009 Patrick Ulbrich // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . #if WIN32 using System; using System.IO; using System.Drawing; using System.Drawing.Imaging; using vbAccelerator.Components.Shell; namespace Platform.Win32 { internal class ThumbnailGenerator : Platform.Common.IThumbnailGenerator { private const int THUMB_SIZE = 128; private bool disposed; private ThumbnailCreator tg; private Bitmap thumbnail; public ThumbnailGenerator () { disposed = false; tg = new ThumbnailCreator(); tg.DesiredSize = new Size(THUMB_SIZE, THUMB_SIZE); thumbnail = null; } public bool GenerateThumbnail(FileInfo fi, string mimeType) { if (thumbnail != null) { thumbnail.Dispose(); thumbnail = null; } try { // FIXME : // tg.GetThumbNail() seems to throw a FileNotFoundException // for every single file it can't create a thumbnail for. // Only generate thumbnails for cherry-picked mimetypes? thumbnail = tg.GetThumbNail(fi.FullName); } catch (Exception) { } return (thumbnail != null); } public void SaveThumbnail(string filename) { if (thumbnail == null) throw new InvalidOperationException("no thumbnail generated"); thumbnail.Save(filename, ImageFormat.Png); } public void Dispose() { Dispose(true); } private void Dispose(bool disposing) { if (!disposed) { if (disposing) { tg.Dispose(); } tg = null; } disposed = true; } } } #endifPlatform/src/Win32/Mime/0000775000175000017500000000000012067326706015111 5ustar patrickpatrickPlatform/src/Win32/Mime/RegistryMime.cs0000664000175000017500000000352712067326706020067 0ustar patrickpatrick// RegistryMime.cs // // Copyright (C) 2008 Patrick Ulbrich // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // #if WIN32 using System; using System.IO; using System.Collections.Generic; using Microsoft.Win32; using Platform.Common.Mime; namespace Platform.Win32.Mime { public static class RegistryMime { private static Dictionary mimeTypes; static RegistryMime() { mimeTypes = new Dictionary(); } public static string GetMimeTypeForExtension(string filename) { if (filename == null) throw new ArgumentNullException("filename"); if (filename.Length == 0) throw new ArgumentException("Argument is emtpy", "filename"); string mimeType; string extension = Path.GetExtension(filename); if (extension.Length == 0) return MimeType.MIME_TYPE_UNKNOWN; if (!extension.StartsWith(".")) extension = "." + extension; if (mimeTypes.TryGetValue(extension, out mimeType)) return mimeType; RegistryKey key = Registry.ClassesRoot.OpenSubKey(extension); if (key == null) mimeType = MimeType.MIME_TYPE_UNKNOWN; else mimeType = (string)key.GetValue("Content Type"); mimeTypes.Add(extension, mimeType); return mimeType; } } } #endifPlatform/src/Unix/0000775000175000017500000000000012067326706014243 5ustar patrickpatrickPlatform/src/Unix/IO/0000775000175000017500000000000012067326706014552 5ustar patrickpatrickPlatform/src/Unix/IO/DkDisk.cs0000664000175000017500000001522312067326706016255 0ustar patrickpatrick// // DkDisk.cs // // Author: // Gabriel Burt // Patrick Ulbrich // // Copyright (C) 2009 Novell, Inc. // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: // // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // #if !WIN32 using System; using DBus; using System.Collections.Generic; namespace Platform.Unix.IO { // modified/extended DeviceKit binding from Banshee // (http://banshee-project.org/) internal class DkDisk { // required by gtk applications // to avoid multithreading issues public static void InitBusG() { BusG.Init(); } public static DkDisk[] EnumerateDevices () { if (disks == null) return null; List lst = new List(); string[] disk_paths = disks.EnumerateDevices(); foreach (string path in disk_paths) { DkDisk d = new DkDisk(path); lst.Add(d); } return lst.ToArray(); } public static DkDisk FindByDevice (string device_path) { if (device_path == null) return null; if (disks == null) return null; string disk_path = null; try { disk_path = disks.FindDeviceByDeviceFile (device_path); } catch {} if (disk_path == null) return null; try { return new DkDisk (disk_path); } catch {} return null; } private IDkDisk disk; private org.freedesktop.DBus.Properties props; public DkDisk (string obj_path) { disk = Bus.System.GetObject("org.freedesktop.UDisks", new ObjectPath(obj_path)); props = Bus.System.GetObject("org.freedesktop.UDisks", new ObjectPath(obj_path)); } public bool IsMounted { get { return (bool) props.Get ("org.freedesktop.UDisks.Device", "DeviceIsMounted"); } } public bool IsReadOnly { get { return (bool) props.Get ("org.freedesktop.UDisks.Device", "DeviceIsReadOnly"); } } public string MountPoint { get { var ary = (string[])props.Get ("org.freedesktop.UDisks.Device", "DeviceMountPaths"); return ary != null && ary.Length > 0 ? ary[0] : null; } } public bool IsMediaAvailable { get { return (bool) props.Get ("org.freedesktop.UDisks.Device", "DeviceIsMediaAvailable"); } } public string Label { get { return (string) props.Get ("org.freedesktop.UDisks.Device", "IdLabel"); } } public string IdType { get { return (string) props.Get ("org.freedesktop.UDisks.Device", "IdType"); } } public bool IsPartitionTable { get { return (bool) props.Get ("org.freedesktop.UDisks.Device", "DeviceIsPartitionTable"); } } public bool IsPartition { get { return (bool) props.Get ("org.freedesktop.UDisks.Device", "DeviceIsPartition"); } } public string PartitionSlave { get { return ((ObjectPath) props.Get ("org.freedesktop.UDisks.Device", "PartitionSlave")).ToString(); } } public bool DeviceIsLuksClearText { get { return (bool) props.Get ("org.freedesktop.UDisks.Device", "DeviceIsLuksCleartext"); } } public string LuksCleartextSlave { get { return ((ObjectPath)props.Get ("org.freedesktop.UDisks.Device", "LuksCleartextSlave")).ToString(); } } public ulong Size { get { return (ulong) props.Get ("org.freedesktop.UDisks.Device", "DeviceSize"); } } public string DeviceFile { get { return (string) props.Get ("org.freedesktop.UDisks.Device", "DeviceFile"); } } public bool IsDrive { get { return (bool) props.Get ("org.freedesktop.UDisks.Device", "DeviceIsDrive"); } } public bool IsRemovable { get { return (bool) props.Get ("org.freedesktop.UDisks.Device", "DeviceIsRemovable"); } } public string[] MediaCompatibility { get { return (string[]) props.Get ("org.freedesktop.UDisks.Device", "DriveMediaCompatibility"); } } public uint NumAudioTracks { get { return (uint) props.Get ("org.freedesktop.UDisks.Device", "OpticalDiscNumAudioTracks"); } } public void Eject () { disk.DriveEject (new string [0]); } public void Unmount () { disk.FilesystemUnmount (new string [0]); } private static IDkDisks disks; static DkDisk () { try { disks = Bus.System.GetObject("org.freedesktop.UDisks", new ObjectPath("/org/freedesktop/UDisks")); } catch {} } [Interface("org.freedesktop.UDisks")] internal interface IDkDisks { string FindDeviceByDeviceFile (string deviceFile); string[] EnumerateDevices (); } } [Interface("org.freedesktop.UDisks.Device")] public interface IDkDisk { bool DeviceIsMounted { get; } string [] DeviceMountPaths { get; } void DriveEject (string [] options); void FilesystemUnmount (string [] options); } } #endifPlatform/src/Unix/IO/UnixFileHelper.cs0000664000175000017500000001017112067326706017764 0ustar patrickpatrick// UnixFileHelper.cs // // Copyright (C) 2008, 2010 Patrick Ulbrich // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // /* * This file contains code * from Mono SVN * /trunk/mcs/class/Mono.Posix/Mono.Unix/UnixFileSystemInfo.cs (rev 59752) * /trunk/mcs/class/Mono.Posix/Mono.Unix/FileTypes.cs (rev 55255) * * TODO : place appropriate copyright notice here */ #if UNIX using System; using System.Text; using Mono.Unix; using Mono.Unix.Native; namespace Platform.Unix.IO { /* from Mono SVN (/trunk/mcs/class/Mono.Posix/Mono.Unix/FileTypes.cs) */ public enum UnixFileType { Directory = (int) FilePermissions.S_IFDIR, CharacterDevice = (int) FilePermissions.S_IFCHR, BlockDevice = (int) FilePermissions.S_IFBLK, RegularFile = (int) FilePermissions.S_IFREG, Fifo = (int) FilePermissions.S_IFIFO, SymbolicLink = (int) FilePermissions.S_IFLNK, Socket = (int) FilePermissions.S_IFSOCK, } public static class UnixFileHelper { public static Stat GetStat(string path) { Stat stat; int r = Syscall.stat(path, out stat); UnixMarshal.ThrowExceptionForLastErrorIf(r); return stat; } public static Stat GetLStat(string path) { Stat stat; int r = Syscall.lstat(path, out stat); UnixMarshal.ThrowExceptionForLastErrorIf(r); return stat; } public static UnixFileType GetFileType(string path) { Stat stat = GetStat(path); return GetFileType(stat); } public static UnixFileType GetFileType(Stat stat) { return (UnixFileType)(stat.st_mode & FilePermissions.S_IFMT); } public static long GetFileSize(string path) { Stat stat = GetStat(path); return GetFileSize(stat); } public static long GetFileSize(Stat stat) { return stat.st_size; } public static DateTime GetLastAccessTime(string path) { Stat stat = GetStat(path); return GetLastAccessTime(stat); } public static DateTime GetLastAccessTime(Stat stat) { return NativeConvert.ToDateTime(stat.st_atime); } public static DateTime GetLastStatusChangeTime(string path) { Stat stat = GetStat(path); return GetLastStatusChangeTime(stat); } public static DateTime GetLastStatusChangeTime(Stat stat) { return NativeConvert.ToDateTime(stat.st_ctime); } public static DateTime GetLastWriteTime(string path) { Stat stat = GetStat(path); return GetLastWriteTime(stat); } public static DateTime GetLastWriteTime(Stat stat) { return NativeConvert.ToDateTime(stat.st_mtime); } public static string ReadLink(string symLinkPath, /* see man readlink */ bool canonicalize_existing) { if (!canonicalize_existing) return ReadLink(symLinkPath); // throws FileNotFoundException if a path component does not exsist, // including the last one. string path = UnixPath.GetCompleteRealPath(symLinkPath); string tmp; while (path != (tmp = UnixPath.GetCompleteRealPath(path))) path = tmp; return path; } public static string ReadLink(string symLinkPath) { StringBuilder buffer = new StringBuilder(256); /* if charcount returned by readlink() equals the buffersize * assume the path was clipped and increase the buffersize. */ while(ReadLink(symLinkPath, buffer) == buffer.Capacity) buffer.EnsureCapacity(buffer.Capacity * 2); return buffer.ToString(); } private static int ReadLink(string symLinkPath, StringBuilder buffer) { int r; r = Syscall.readlink(symLinkPath, buffer); UnixMarshal.ThrowExceptionForLastErrorIf(r); return r; } } } #endifPlatform/src/Unix/IO/DkDriveInfoProvider.cs0000664000175000017500000001262112067326706020762 0ustar patrickpatrick// DkDriveInfoProvider.cs // // Copyright (C) 2011, 2012 Patrick Ulbrich // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // #if !WIN32 using System; using System.Collections.Generic; using Platform.Common.IO; using Platform.Common.Diagnostics; namespace Platform.Unix.IO { internal class DkDriveInfoProvider : IDriveInfoProvider { static DkDriveInfoProvider() { // required by gtk apps to prevent multithreading issues DkDisk.InitBusG(); } public virtual void FromDevice(DriveInfo d, string device) { // dev can be a drive (e.g. cdrom with/without media, an usb-stick with a custom format (no partitions), ...), // a partitiontable, a partition or a luks-holder representing an encrypted filesystem. DkDisk dev = DkDisk.FindByDevice(device); if (dev == null) throw new ArgumentException("Can't find drive for specified device", "device"); if (dev.IsPartitionTable) throw new ArgumentException("Device is a harddisk drive and may have one ore more volumes (partitions) with different devices names. Please specify the devicename of one of its volumes instead", "device"); FillDriveInfo(d, dev); } public virtual void FromPath(DriveInfo d, string rootPath) { // remove endling slash from path if ((rootPath.Length > 1) && (rootPath[rootPath.Length - 1] == System.IO.Path.DirectorySeparatorChar)) rootPath = rootPath.Substring(0, rootPath.Length - 1); DkDisk volume = null; DkDisk[] devs = DkDisk.EnumerateDevices(); foreach (DkDisk dev in devs) { if (dev.IsMounted && dev.MountPoint == rootPath) { volume = dev; break; } } if (volume == null) throw new ArgumentException("Can't find drive for specified path", "rootPath"); FillDriveInfo(d, volume); } public virtual List GetAll(bool readyDrivesOnly) { List drives = new List(); // dev can be a drive (e.g. cdrom with/without media, an usb-stick with a custom format (no partitions), ...), // a partitiontable, a partition or a luks-holder representing an encrypted filesystem. DkDisk[] devs = DkDisk.EnumerateDevices(); foreach (DkDisk dev in devs) { // skip empty drives when readyDrivesOnly is set to true. // (ready means media present but not necessarily mounted, e.g. audio cds) if (readyDrivesOnly && !dev.IsMediaAvailable) continue; // skip partitiontables, e.g. sda, sdb (usb-stick). // (partitiontables are drives) if (dev.IsPartitionTable) continue; // skip unmounted partitions (e.g. swap) and // boot and home partitions. if ((dev.IsPartition || dev.DeviceIsLuksClearText) && (!dev.IsMounted || (dev.MountPoint == "/boot") || (dev.MountPoint == "/home"))) continue; DriveInfo d = new DriveInfo(); FillDriveInfo(d, dev); drives.Add(d); } return drives; } private static void FillDriveInfo(DriveInfo d, DkDisk dev) { Debug.Assert(!dev.IsPartitionTable, "dev must not be a partitiontable"); if (dev.IsMounted) { d.volumeLabel = dev.Label; d.totalSize = (long)dev.Size; d.rootPath = dev.MountPoint; d.filesystem = dev.IdType; d.isMounted = true; d.isReady = true; } else if (dev.IsMediaAvailable) { // unmounted media, partition or luks-holder d.volumeLabel = dev.Label; d.totalSize = (long)dev.Size; d.filesystem = dev.IdType; d.isReady = true; } // else: empty drive if (dev.IsPartition) { string obj_path = dev.PartitionSlave; DkDisk parent = new DkDisk(obj_path); d.driveType = GetDriveType(parent); } else if (dev.DeviceIsLuksClearText) { // dev is a luks-holder representing an encrypted filesystem DkDisk parent = new DkDisk(dev.LuksCleartextSlave); if (parent.IsDrive) { d.driveType = GetDriveType(parent); } else { if (parent.IsPartition) { parent = new DkDisk(parent.PartitionSlave); d.driveType = GetDriveType(parent); } else { d.driveType = DriveType.Unknown; } } } else if (dev.IsDrive) { d.driveType = GetDriveType(dev); } else { throw new ArgumentException("DkDisk is of an unknown type"); } d.device = dev.DeviceFile; d.hasAudioCdVolume = (dev.NumAudioTracks > 0); } private static DriveType GetDriveType(DkDisk drive) { Debug.Assert(drive.IsDrive, "DkDisk is not a drive"); // TODO : add support for ram and network volumes DriveType dt = DriveType.Unknown; string[] compat = drive.MediaCompatibility; bool isOptical = false; foreach (string c in compat) { if (c.StartsWith("optical")) { isOptical = true; break; } } if (isOptical) dt = DriveType.CDRom; else if (drive.IsRemovable) dt = DriveType.Removable; else dt = DriveType.Fixed; return dt; } } } #endifPlatform/src/Unix/Mime/0000775000175000017500000000000012067326706015132 5ustar patrickpatrickPlatform/src/Unix/Mime/Mime.cs0000664000175000017500000006732212067326706016362 0ustar patrickpatrick// Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: // // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // // Copyright (c) 2006 Alexander Olk // // Authors: // // Alexander Olk alex.olk@googlemail.com // #if UNIX #define NET_2_0 using System; using System.IO; using System.Collections; using System.Collections.Specialized; using System.Text.RegularExpressions; using System.Text; // Usage: // - for files: // string mimeType = Mime.GetMimeTypeForFile( string filename ); // - for byte array: // string mimeType = Mime.GetMimeTypeForData( byte[] data ); // - for string (maybe an email): // string mimeType = Mime.GetMimeTypeForString( string input ); // - get alias for mime type: // string alias = Mime.GetMimeAlias( string mimeType ); // - get subclass for mime type: // string subtype = Mime.GetMimeSubClass( string mimeType ); // - get all available mime types: // string[] available = Mime.AvailableMimeTypes; // TODO: // - optimize even more :) // - async callback ?!? // - freedesktop org file extensions can have regular expressions also, resolve them too // - sort match collections by magic priority ( higher = first ) ? // internal test: // looking up the mime types 20 times for 2757 files in /usr/lib without caching (mime_file_cache) // old version: Time: 00:00:32.3791220 // new version: Time: 00:00:16.9991810 namespace Platform.Unix.Mime { public class Mime { public static Mime Instance = new Mime(); private string current_file_name; private string global_result = octet_stream; private FileStream file_stream; private byte[] buffer = null; private const string octet_stream = "application/octet-stream"; private const string text_plain = "text/plain"; private const string zero_file = "application/x-zerosize"; private StringDictionary mime_file_cache = new StringDictionary(); private const int mime_file_cache_max_size = 3000; private string search_string; private static object lock_object = new Object(); private bool is_zero_file = false; private int bytes_read = 0; private bool mime_available = false; public static NameValueCollection Aliases; public static NameValueCollection SubClasses; public static NameValueCollection GlobalPatternsShort; public static NameValueCollection GlobalPatternsLong; public static NameValueCollection GlobalLiterals; public static NameValueCollection GlobalSufPref; public static ArrayList Matches80Plus; public static ArrayList MatchesBelow80; private Mime () { #if NET_2_0 Aliases = new NameValueCollection (StringComparer.CurrentCultureIgnoreCase); SubClasses = new NameValueCollection (StringComparer.CurrentCultureIgnoreCase); GlobalPatternsShort = new NameValueCollection (StringComparer.CurrentCultureIgnoreCase); GlobalPatternsLong = new NameValueCollection (StringComparer.CurrentCultureIgnoreCase); GlobalLiterals = new NameValueCollection (StringComparer.CurrentCultureIgnoreCase); GlobalSufPref = new NameValueCollection (StringComparer.CurrentCultureIgnoreCase); #else Aliases = new NameValueCollection (new CaseInsensitiveHashCodeProvider (), new Comparer (System.Globalization.CultureInfo.CurrentUICulture)); SubClasses = new NameValueCollection (new CaseInsensitiveHashCodeProvider (), new Comparer (System.Globalization.CultureInfo.CurrentUICulture)); GlobalPatternsShort = new NameValueCollection (new CaseInsensitiveHashCodeProvider (), new Comparer (System.Globalization.CultureInfo.CurrentUICulture)); GlobalPatternsLong = new NameValueCollection (new CaseInsensitiveHashCodeProvider (), new Comparer (System.Globalization.CultureInfo.CurrentUICulture)); GlobalLiterals = new NameValueCollection (new CaseInsensitiveHashCodeProvider (), new Comparer (System.Globalization.CultureInfo.CurrentUICulture)); GlobalSufPref = new NameValueCollection (new CaseInsensitiveHashCodeProvider (), new Comparer (System.Globalization.CultureInfo.CurrentUICulture)); #endif Matches80Plus = new ArrayList (); MatchesBelow80 = new ArrayList (); FDOMimeConfigReader fmcr = new FDOMimeConfigReader (); int buffer_length = fmcr.Init (); if (buffer_length >= 32) { buffer = new byte [buffer_length]; mime_available = true; } } public static bool MimeAvailable { get { return Instance.mime_available; } } public static string GetMimeTypeForFile (string filename) { lock (lock_object) { Instance.StartByFileName (filename); } return Instance.global_result; } // not tested public static string GetMimeTypeForData (byte[] data) { lock (lock_object) { Instance.StartDataLookup (data); } return Instance.global_result; } public static string GetMimeTypeForString (string input) { lock (lock_object) { Instance.StartStringLookup (input); } return Instance.global_result; } public static string GetMimeAlias (string mimetype) { return Aliases [mimetype]; } public static string GetMimeSubClass (string mimetype) { return SubClasses [mimetype]; } public static void CleanFileCache () { lock (lock_object) { Instance.mime_file_cache.Clear (); } } private void StartByFileName (string filename) { if (mime_file_cache.ContainsKey (filename)) { global_result = mime_file_cache [filename]; return; } current_file_name = filename; is_zero_file = false; global_result = octet_stream; GoByFileName (); mime_file_cache.Add (current_file_name, global_result); if (mime_file_cache.Count > mime_file_cache_max_size) { IEnumerator enumerator = mime_file_cache.GetEnumerator (); int counter = mime_file_cache_max_size - 500; while (enumerator.MoveNext ()) { mime_file_cache.Remove (enumerator.Current.ToString ()); counter--; if (counter == 0) break; } } } private void StartDataLookup (byte[] data) { global_result = octet_stream; System.Array.Clear (buffer, 0, buffer.Length); if (data.Length > buffer.Length) { System.Array.Copy (data, buffer, buffer.Length); } else { System.Array.Copy (data, buffer, data.Length); } if (CheckMatch80Plus ()) return; if (CheckMatchBelow80 ()) return; CheckForBinaryOrText (); } private void StartStringLookup (string input) { global_result = text_plain; search_string = input; if (CheckForContentTypeString ()) return; } private void GoByFileName () { // check if we can open the file if (!MimeAvailable || !OpenFile ()) { // couldn't open the file, check globals only CheckGlobalPatterns (); return; } if (!is_zero_file) { // check for matches with a priority >= 80 if (CheckMatch80Plus ()) return; } // check global patterns, aka file extensions... // this should be done for zero size files also, // for example zero size file trash.ccc~ should return // application/x-trash instead of application/x-zerosize if (CheckGlobalPatterns ()) return; // if file size is zero, no other checks are needed if (is_zero_file) return; // ok, still nothing matches then try matches with a priority < 80 if (CheckMatchBelow80 ()) return; // wow, still nothing... return application/octet-stream for binary data, or text/plain for textual data CheckForBinaryOrText (); } private bool CheckMatch80Plus () { foreach (Match match in Matches80Plus) { if (TestMatch (match)) { global_result = match.MimeType; return true; } } return false; } // this little helper method gives us a real speed improvement private bool FastEndsWidth (string input, string value) { if (value.Length > input.Length) return false; int z = input.Length - 1; for (int i = value.Length - 1; i > -1; i--) { if (value [i] != input [z]) return false; z--; } return true; } private bool FastStartsWith (string input, string value) { if (value.Length > input.Length) return false; for (int i = 0; i < value.Length; i++) if (value [i] != input [i]) return false; return true; } // start always with index = 0 private int FastIndexOf (string input, char value) { if (input.Length == 0) return -1; for (int i = 0; i < input.Length; i++) if (input [i] == value) return i; return -1; } private int FastIndexOf (string input, string value) { if (input.Length == 0) return -1; for (int i = 0; i < input.Length - value.Length; i++) { if (input [i] == value [0]) { int counter = 0; for (int z = 1; z < value.Length; z++) { if (input [i + z] != value [z]) break; counter++; } if (counter == value.Length - 1) { return i; } } } return -1; } private void CheckGlobalResult () { int comma_index = FastIndexOf (global_result, ','); if (comma_index != -1) { global_result = global_result.Substring (0, comma_index); } } private bool CheckGlobalPatterns () { string filename = Path.GetFileName (current_file_name); // first check for literals for (int i = 0; i < GlobalLiterals.Count; i++) { string key = GlobalLiterals.GetKey (i); // no regex char if (FastIndexOf (key, '[') == -1) { if (FastIndexOf (filename, key) != -1) { global_result = GlobalLiterals [i]; CheckGlobalResult (); return true; } } else { if (Regex.IsMatch (filename, key)) { global_result = GlobalLiterals [i]; CheckGlobalResult (); return true; } } } if (FastIndexOf (filename, '.') != -1) { // check for double extension like .tar.gz for (int i = 0; i < GlobalPatternsLong.Count; i++) { string key = GlobalPatternsLong.GetKey (i); if (FastEndsWidth (filename, key)) { global_result = GlobalPatternsLong [i]; CheckGlobalResult (); return true; } else { if (FastEndsWidth (filename.ToLower (), key)) { global_result = GlobalPatternsLong [i]; CheckGlobalResult (); return true; } } } // check normal extensions... string extension = Path.GetExtension (current_file_name); if (extension.Length != 0) { string global_result_tmp = GlobalPatternsShort [extension]; if (global_result_tmp != null) { global_result = global_result_tmp; CheckGlobalResult (); return true; } global_result_tmp = GlobalPatternsShort [extension.ToLower ()]; if (global_result_tmp != null) { global_result = global_result_tmp; CheckGlobalResult (); return true; } } } // finally check if a prefix or suffix matches for (int i = 0; i < GlobalSufPref.Count; i++) { string key = GlobalSufPref.GetKey (i); if (key [0] == '*') { if (FastEndsWidth (filename, key.Replace ("*", String.Empty))) { global_result = GlobalSufPref [i]; CheckGlobalResult (); return true; } } else { if (FastStartsWith (filename, key.Replace ("*", String.Empty))) { global_result = GlobalSufPref [i]; CheckGlobalResult (); return true; } } } return false; } private bool CheckMatchBelow80 () { foreach (Match match in MatchesBelow80) { if (TestMatch (match)) { global_result = match.MimeType; return true; } } return false; } private void CheckForBinaryOrText () { // check the first 32 bytes for (int i = 0; i < 32; i++) { char c = System.Convert.ToChar (buffer [i]); if (c != '\t' && c != '\n' && c != '\r' && c != 12 && c < 32) { global_result = octet_stream; return; } } global_result = text_plain; } private bool TestMatch (Match match) { foreach (Matchlet matchlet in match.Matchlets) if (TestMatchlet (matchlet)) return true; return false; } private bool TestMatchlet (Matchlet matchlet) { // using a simple brute force search algorithm // compare each (masked) value from the buffer with the (masked) value from the matchlet // no need to check if the offset + the bytevalue length exceed the # bytes read if (matchlet.Offset + matchlet.ByteValue.Length > bytes_read) return false; for (int offset_counter = 0; offset_counter < matchlet.OffsetLength; offset_counter++) { if (matchlet.Offset + offset_counter + matchlet.ByteValue.Length > bytes_read) return false; if (matchlet.Mask == null) { if (buffer [matchlet.Offset + offset_counter] == matchlet.ByteValue [0]) { if (matchlet.ByteValue.Length == 1) { if (matchlet.Matchlets.Count > 0) { foreach (Matchlet sub_matchlet in matchlet.Matchlets) { if (TestMatchlet (sub_matchlet)) return true; } } else return true; } int minus = 0; // check if the last matchlet byte value is the same as the byte value in the buffer... if (matchlet.ByteValue.Length > 2) { if (buffer [matchlet.Offset + offset_counter + matchlet.ByteValue.Length - 1] != matchlet.ByteValue [matchlet.ByteValue.Length - 1]) return false; minus = 1; } for (int i = 1; i < matchlet.ByteValue.Length - minus; i++) { if (buffer [matchlet.Offset + offset_counter + i] != matchlet.ByteValue [i]) return false; } if (matchlet.Matchlets.Count > 0) { foreach (Matchlet sub_matchlets in matchlet.Matchlets) { if (TestMatchlet (sub_matchlets)) return true; } } else return true; } } else { if ((buffer [matchlet.Offset + offset_counter] & matchlet.Mask [0]) == (matchlet.ByteValue [0] & matchlet.Mask [0])) { if (matchlet.ByteValue.Length == 1) { if (matchlet.Matchlets.Count > 0) { foreach (Matchlet sub_matchlets in matchlet.Matchlets) { if (TestMatchlet (sub_matchlets)) return true; } } else return true; } int minus = 0; // check if the last matchlet byte value is the same as the byte value in the buffer... if (matchlet.ByteValue.Length > 2) { if ((buffer [matchlet.Offset + offset_counter + matchlet.ByteValue.Length - 1] & matchlet.Mask [matchlet.ByteValue.Length - 1]) != (matchlet.ByteValue [matchlet.ByteValue.Length - 1] & matchlet.Mask [matchlet.ByteValue.Length - 1])) return false; minus = 1; } for (int i = 1; i < matchlet.ByteValue.Length - minus; i++) { if ((buffer [matchlet.Offset + offset_counter + i] & matchlet.Mask [i]) != (matchlet.ByteValue [i] & matchlet.Mask [i])) return false; } if (matchlet.Matchlets.Count > 0) { foreach (Matchlet sub_matchlets in matchlet.Matchlets) { if (TestMatchlet (sub_matchlets)) return true; } } else return true; } } } return false; } private bool OpenFile () { try { file_stream = new FileStream (current_file_name, FileMode.Open, FileAccess.Read); // FileShare ??? use BinaryReader ??? if (file_stream.Length == 0) { global_result = zero_file; is_zero_file = true; } else { bytes_read = file_stream.Read (buffer, 0, buffer.Length); // do not clear the whole buffer everytime; clear only what's needed if (bytes_read < buffer.Length) { System.Array.Clear (buffer, bytes_read, buffer.Length - bytes_read); } } file_stream.Close (); } catch (Exception) { return false; } return true; } private bool CheckForContentTypeString () { int index = search_string.IndexOf ("Content-type:"); if (index != -1) { index += 13; // Length of string "Content-type:" global_result = String.Empty; while (search_string [index] != ';') { global_result += search_string [index++]; } global_result.Trim (); return true; } // convert string to byte array byte[] string_byte = (new ASCIIEncoding ()).GetBytes (search_string); System.Array.Clear (buffer, 0, buffer.Length); if (string_byte.Length > buffer.Length) { System.Array.Copy (string_byte, buffer, buffer.Length); } else { System.Array.Copy (string_byte, buffer, string_byte.Length); } if (CheckMatch80Plus ()) return true; if (CheckMatchBelow80 ()) return true; return false; } } internal class FDOMimeConfigReader { bool fdo_mime_available = false; StringCollection shared_mime_paths = new StringCollection (); BinaryReader br; int max_offset_and_range = 0; public int Init () { CheckFDOMimePaths (); if (!fdo_mime_available) return -1; ReadMagicData (); ReadGlobsData (); ReadSubclasses (); ReadAliases (); shared_mime_paths = null; br = null; return max_offset_and_range; } private void CheckFDOMimePaths () { if (Directory.Exists ("/usr/share/mime")) shared_mime_paths.Add ("/usr/share/mime/"); else if (Directory.Exists ("/usr/local/share/mime")) shared_mime_paths.Add ("/usr/local/share/mime/"); if (Directory.Exists (System.Environment.GetFolderPath (Environment.SpecialFolder.Personal) + "/.local/share/mime")) shared_mime_paths.Add (System.Environment.GetFolderPath (Environment.SpecialFolder.Personal) + "/.local/share/mime/"); if (shared_mime_paths.Count == 0) return; fdo_mime_available = true; } private void ReadMagicData () { foreach (string path in shared_mime_paths) { if (!File.Exists (path + "/magic")) continue; try { FileStream fs = File.OpenRead (path + "/magic"); br = new BinaryReader (fs); if (CheckMagicHeader ()) { MakeMatches (); } br.Close (); fs.Close (); } catch (Exception ) { } } } private void MakeMatches () { Matchlet[] matchlets = new Matchlet [30]; while (br.PeekChar () != -1) { int priority = -1; string mime_type = ReadPriorityAndMimeType (ref priority); if (mime_type != null) { Match match = new Match (); match.Priority = priority; match.MimeType = mime_type; while (true) { int indent = 0; // indent char c; if (br.PeekChar () != '>') { StringBuilder indent_string = new StringBuilder (); //string indent_string = String.Empty; while (true) { if (br.PeekChar () == '>') break; c = br.ReadChar (); //indent_string += c; indent_string.Append (c); } indent = Convert.ToInt32 (indent_string.ToString ()); } int offset = 0; // offset if (br.PeekChar () == '>') { br.ReadChar (); offset = ReadValue (); } int value_length = 0; byte[] value = null; // value length and value if (br.PeekChar () == '=') { br.ReadChar (); // read 2 bytes value length (always big endian) byte first = br.ReadByte (); byte second = br.ReadByte (); value_length = first * 256 + second; value = br.ReadBytes (value_length); } // mask byte[] mask = null; if (br.PeekChar () == '&') { br.ReadChar (); mask = br.ReadBytes (value_length); } // word_size int word_size = 1; if (br.PeekChar () == '~') { br.ReadChar (); c = br.ReadChar (); word_size = Convert.ToInt32 (c - 0x30); // data is stored in big endian format. if (word_size > 1 && System.BitConverter.IsLittleEndian) { //convert the value and, if available, the mask data to little endian if (word_size == 2) { if (value != null) { for (int i = 0; i < value.Length; i += 2) { byte one = value [i]; byte two = value [i + 1]; value [i] = two; value [i + 1] = one; } } if (mask != null) { for (int i = 0; i < mask.Length; i += 2) { byte one = mask [i]; byte two = mask [i + 1]; mask [i] = two; mask [i + 1] = one; } } } else if (word_size == 4) { if (value != null) { for (int i = 0; i < value.Length; i += 4) { byte one = value [i]; byte two = value [i + 1]; byte three = value [i + 2]; byte four = value [i + 3]; value [i] = four; value [i + 1] = three; value [i + 2] = two; value [i + 3] = one; } } if (mask != null) { for (int i = 0; i < mask.Length; i += 4) { byte one = mask [i]; byte two = mask [i + 1]; byte three = mask [i + 2]; byte four = mask [i + 3]; mask [i] = four; mask [i + 1] = three; mask [i + 2] = two; mask [i + 3] = one; } } } } } // range length int range_length = 1; if (br.PeekChar () == '+') { br.ReadChar (); range_length = ReadValue (); } // read \n br.ReadChar (); // create the matchlet matchlets [indent] = new Matchlet (); matchlets [indent].Offset = offset; matchlets [indent].OffsetLength = range_length; matchlets [indent].ByteValue = value; if (mask != null) matchlets [indent].Mask = mask; if (indent == 0) { match.Matchlets.Add (matchlets [indent]); } else { matchlets [indent - 1].Matchlets.Add (matchlets [indent]); } if (max_offset_and_range < matchlets [indent].Offset + matchlets [indent].OffsetLength + matchlets [indent].ByteValue.Length + 1) max_offset_and_range = matchlets [indent].Offset + matchlets [indent].OffsetLength + matchlets [indent].ByteValue.Length + 1; // if '[' move to next mime type if (br.PeekChar () == '[') break; } if (priority < 80) Mime.MatchesBelow80.Add (match); else Mime.Matches80Plus.Add (match); } } } private void ReadGlobsData () { foreach (string path in shared_mime_paths) { if (!File.Exists (path + "/globs")) continue; try { StreamReader sr = new StreamReader (path + "/globs"); while (sr.Peek () != -1) { string line = sr.ReadLine ().Trim (); if (line.StartsWith ("#")) continue; string[] split = line.Split (new char [] {':'}); if (split [1].IndexOf ('*') > -1 && split [1].IndexOf ('.') == -1) { Mime.GlobalSufPref.Add (split [1], split [0]); } else if (split [1]. IndexOf ('*') == -1) { Mime.GlobalLiterals.Add (split [1], split [0]); } else { string[] split2 = split [1].Split (new char [] {'.'}); if (split2.Length > 2) { // more than one dot Mime.GlobalPatternsLong.Add (split [1].Remove (0, 1), split [0]); } else { // normal Mime.GlobalPatternsShort.Add (split [1].Remove (0, 1), split [0]); } } } sr.Close (); } catch (Exception ) { } } } private void ReadSubclasses () { foreach (string path in shared_mime_paths) { if (!File.Exists (path + "/subclasses")) continue; try { StreamReader sr = new StreamReader (path + "/subclasses"); while (sr.Peek () != -1) { string line = sr.ReadLine ().Trim (); if (line.StartsWith ("#")) continue; string[] split = line.Split (new char [] {' '}); Mime.SubClasses.Add (split [0], split [1]); } sr.Close (); } catch (Exception ) { } } } private void ReadAliases () { foreach (string path in shared_mime_paths) { if (!File.Exists (path + "/aliases")) continue; try { StreamReader sr = new StreamReader (path + "/aliases"); while (sr.Peek () != -1) { string line = sr.ReadLine ().Trim (); if (line.StartsWith ("#")) continue; string[] split = line.Split (new char [] {' '}); Mime.Aliases.Add (split [0], split [1]); } sr.Close (); } catch (Exception ) { } } } private int ReadValue () { StringBuilder result_string = new StringBuilder (); int result = 0; char c; while (true) { if (br.PeekChar () == '=' || br.PeekChar () == '\n') break; c = br.ReadChar (); result_string.Append (c); } result = Convert.ToInt32 (result_string.ToString ()); return result; } private string ReadPriorityAndMimeType (ref int priority) { if (br.ReadChar () == '[') { StringBuilder priority_string = new StringBuilder (); while (true) { char c = br.ReadChar (); if (c == ':') break; priority_string.Append (c); } priority = System.Convert.ToInt32 (priority_string.ToString ()); StringBuilder mime_type_result = new StringBuilder (); while (true) { char c = br.ReadChar (); if (c == ']') break; mime_type_result.Append (c); } if (br.ReadChar () == '\n') return mime_type_result.ToString (); } return null; } private bool CheckMagicHeader () { char[] chars = br.ReadChars (10); string magic_header = new String (chars); if (magic_header != "MIME-Magic") return false; if (br.ReadByte () != 0) return false; if (br.ReadChar () != '\n') return false; return true; } } internal class Match { string mimeType; int priority; ArrayList matchlets = new ArrayList(); public string MimeType { set { mimeType = value; } get { return mimeType; } } public int Priority { set { priority = value; } get { return priority; } } public ArrayList Matchlets { get { return matchlets; } } } internal class Matchlet { byte[] byteValue; byte[] mask = null; int offset; int offsetLength; int wordSize = 1; ArrayList matchlets = new ArrayList (); public byte[] ByteValue { set { byteValue = value; } get { return byteValue; } } public byte[] Mask { set { mask = value; } get { return mask; } } public int Offset { set { offset = value; } get { return offset; } } public int OffsetLength { set { offsetLength = value; } get { return offsetLength; } } public int WordSize { set { wordSize = value; } get { return wordSize; } } public ArrayList Matchlets { get { return matchlets; } } } } #endif Platform/src/Gnome/0000775000175000017500000000000012067326706014365 5ustar patrickpatrickPlatform/src/Gnome/GnomeDesktop/0000775000175000017500000000000012067326706016764 5ustar patrickpatrickPlatform/src/Gnome/GnomeDesktop/DesktopThumbnailSize.cs0000664000175000017500000000046412067326706023427 0ustar patrickpatrick// This file was generated by the Gtk# code generator. // Any changes made will be lost if regenerated. #if GNOME namespace Gnome { using System; using System.Runtime.InteropServices; #region Autogenerated code internal /*public*/ enum DesktopThumbnailSize { Normal, Large, } #endregion } #endif Platform/src/Gnome/GnomeDesktop/DesktopThumbnailFactory.cs0000664000175000017500000001044212067326706024121 0ustar patrickpatrick// This file was generated by the Gtk# code generator. // Any changes made will be lost if regenerated. #if GNOME namespace Gnome { using System; using System.Collections; using System.Runtime.InteropServices; #region Autogenerated code internal /*public*/ class DesktopThumbnailFactory : GLib.Object { public DesktopThumbnailFactory(IntPtr raw) : base(raw) {} [DllImport("gnome-desktop-2")] static extern IntPtr gnome_desktop_thumbnail_factory_new(int size); public DesktopThumbnailFactory (Gnome.DesktopThumbnailSize size) : base (IntPtr.Zero) { if (GetType () != typeof (DesktopThumbnailFactory)) { throw new InvalidOperationException ("Can't override this constructor."); } Raw = gnome_desktop_thumbnail_factory_new((int) size); } [DllImport("gnome-desktop-2")] static extern bool gnome_desktop_thumbnail_factory_has_valid_failed_thumbnail(IntPtr raw, IntPtr uri, IntPtr mtime); public bool HasValidFailedThumbnail(string uri, System.DateTime mtime) { IntPtr native_uri = GLib.Marshaller.StringToPtrGStrdup (uri); bool raw_ret = gnome_desktop_thumbnail_factory_has_valid_failed_thumbnail(Handle, native_uri, GLib.Marshaller.DateTimeTotime_t (mtime)); bool ret = raw_ret; GLib.Marshaller.Free (native_uri); return ret; } [DllImport("gnome-desktop-2")] static extern void gnome_desktop_thumbnail_factory_save_thumbnail(IntPtr raw, IntPtr thumbnail, IntPtr uri, IntPtr original_mtime); public void SaveThumbnail(Gdk.Pixbuf thumbnail, string uri, System.DateTime original_mtime) { IntPtr native_uri = GLib.Marshaller.StringToPtrGStrdup (uri); gnome_desktop_thumbnail_factory_save_thumbnail(Handle, thumbnail == null ? IntPtr.Zero : thumbnail.Handle, native_uri, GLib.Marshaller.DateTimeTotime_t (original_mtime)); GLib.Marshaller.Free (native_uri); } [DllImport("gnome-desktop-2")] static extern IntPtr gnome_desktop_thumbnail_factory_generate_thumbnail(IntPtr raw, IntPtr uri, IntPtr mime_type); public Gdk.Pixbuf GenerateThumbnail(string uri, string mime_type) { IntPtr native_uri = GLib.Marshaller.StringToPtrGStrdup (uri); IntPtr native_mime_type = GLib.Marshaller.StringToPtrGStrdup (mime_type); IntPtr raw_ret = gnome_desktop_thumbnail_factory_generate_thumbnail(Handle, native_uri, native_mime_type); Gdk.Pixbuf ret = GLib.Object.GetObject(raw_ret) as Gdk.Pixbuf; GLib.Marshaller.Free (native_uri); GLib.Marshaller.Free (native_mime_type); return ret; } [DllImport("gnome-desktop-2")] static extern IntPtr gnome_desktop_thumbnail_factory_get_type(); public static new GLib.GType GType { get { IntPtr raw_ret = gnome_desktop_thumbnail_factory_get_type(); GLib.GType ret = new GLib.GType(raw_ret); return ret; } } [DllImport("gnome-desktop-2")] static extern bool gnome_desktop_thumbnail_factory_can_thumbnail(IntPtr raw, IntPtr uri, IntPtr mime_type, IntPtr mtime); public bool CanThumbnail(string uri, string mime_type, System.DateTime mtime) { IntPtr native_uri = GLib.Marshaller.StringToPtrGStrdup (uri); IntPtr native_mime_type = GLib.Marshaller.StringToPtrGStrdup (mime_type); bool raw_ret = gnome_desktop_thumbnail_factory_can_thumbnail(Handle, native_uri, native_mime_type, GLib.Marshaller.DateTimeTotime_t (mtime)); bool ret = raw_ret; GLib.Marshaller.Free (native_uri); GLib.Marshaller.Free (native_mime_type); return ret; } [DllImport("gnome-desktop-2")] static extern void gnome_desktop_thumbnail_factory_create_failed_thumbnail(IntPtr raw, IntPtr uri, IntPtr mtime); public void CreateFailedThumbnail(string uri, System.DateTime mtime) { IntPtr native_uri = GLib.Marshaller.StringToPtrGStrdup (uri); gnome_desktop_thumbnail_factory_create_failed_thumbnail(Handle, native_uri, GLib.Marshaller.DateTimeTotime_t (mtime)); GLib.Marshaller.Free (native_uri); } [DllImport("gnome-desktop-2")] static extern IntPtr gnome_desktop_thumbnail_factory_lookup(IntPtr raw, IntPtr uri, IntPtr mtime); public string Lookup(string uri, System.DateTime mtime) { IntPtr native_uri = GLib.Marshaller.StringToPtrGStrdup (uri); IntPtr raw_ret = gnome_desktop_thumbnail_factory_lookup(Handle, native_uri, GLib.Marshaller.DateTimeTotime_t (mtime)); string ret = GLib.Marshaller.PtrToStringGFree(raw_ret); GLib.Marshaller.Free (native_uri); return ret; } #endregion } } #endif Platform/src/Gnome/IO/0000775000175000017500000000000012067326706014674 5ustar patrickpatrickPlatform/src/Gnome/IO/GioDriveInfoProvider.cs0000664000175000017500000000625112067326706021266 0ustar patrickpatrick// GioDriveInfoProvider.cs // // Copyright (C) 2011 Patrick Ulbrich // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // #if GNOME using System; using System.Collections.Generic; using GLib; using Platform.Common.IO; using Platform.Unix.IO; namespace Platform.Gnome.IO { internal class GioDriveInfoProvider : DkDriveInfoProvider { private static readonly Dictionary supportedSchemes = new Dictionary() { { "file", "FILE" }, { "smb", "SMB" }, { "ssh", "SSH" }, { "archive", "ARCHIVE" } }; public override void FromDevice(DriveInfo d, string device) { base.FromDevice(d, device); } public override void FromPath(DriveInfo d, string rootPath) { try { base.FromPath(d, rootPath); } catch (ArgumentException) { // rootpath was not found in devicekit disks // try to find a GIO mountpoint with that path var mounts = GLib.VolumeMonitor.Default.Mounts; foreach (var m in mounts) { if (supportedSchemes.ContainsKey(m.Root.UriScheme) && (m.Root.Path == rootPath)) { FillDriveInfo(d, m); return; } } throw new ArgumentException("Can't find drive for specified path", "rootPath"); } } public override List GetAll(bool readyDrivesOnly) { List drives = base.GetAll(readyDrivesOnly); // base.GetAll() has returned all mounted (and unmounted) fixed and removable volumes. // the remaining mounts are expected to be network shares, virtual volumes // (mounted iso images, dirs mounted with bindfs) etc. var mounts = GLib.VolumeMonitor.Default.Mounts; foreach (var m in mounts) { if (supportedSchemes.ContainsKey(m.Root.UriScheme) && (drives.FindIndex(e => IsEqual(e, m)) == -1)) { DriveInfo d = new DriveInfo(); FillDriveInfo(d, m); drives.Add(d); } } return drives; } private static void FillDriveInfo(DriveInfo d, GLib.Mount m) { d.volumeLabel = m.Name; d.totalSize = 0L; d.rootPath = m.Root.Path; d.device = null; d.driveType = GetDriveType(m); d.filesystem = null; d.isMounted = true; d.isReady = true; d.hasAudioCdVolume = false; } private static bool IsEqual(DriveInfo d, GLib.Mount m) { return d.IsMounted && (d.RootPath == m.Root.Path); } private static Platform.Common.IO.DriveType GetDriveType(GLib.Mount m) { switch (m.Root.UriScheme) { case "file": case "archive": return DriveType.Unknown; case "ssh": case "smb": return DriveType.Network; default: return DriveType.Unknown; } } } } #endifPlatform/src/Gnome/ThumbnailGenerator.cs0000664000175000017500000000366512067326706020520 0ustar patrickpatrick// ThumbnailGenerator.cs // // Copyright (C) 2008, 2012 Patrick Ulbrich // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // #if GNOME using System; using System.IO; using Gnome; using Gdk; namespace Platform.Gnome { internal class ThumbnailGenerator : Platform.Common.IThumbnailGenerator { private const DesktopThumbnailSize THUMB_SIZE = DesktopThumbnailSize.Normal; // 100 pix private DesktopThumbnailFactory tf; private Pixbuf thumbnail; private bool disposed; public ThumbnailGenerator() { disposed = false; tf = new DesktopThumbnailFactory(THUMB_SIZE); } public bool GenerateThumbnail(FileInfo fi, string mimeType) { if (thumbnail != null) { thumbnail.Dispose(); thumbnail = null; } string uri = new Uri(fi.FullName).ToString(); if (tf.CanThumbnail(uri, mimeType, fi.LastWriteTime)) { thumbnail = tf.GenerateThumbnail(uri, mimeType); if (thumbnail != null) return true; } return false; } public void SaveThumbnail(string filename) { if (thumbnail == null) throw new InvalidOperationException("no thumbnail generated"); thumbnail.Save(filename, "png"); } public void Dispose() { Dispose(true); } private void Dispose(bool disposing) { if (!disposed) { if (disposing) { tf.Dispose(); } tf = null; } disposed = true; } } } #endifPlatform/src/Common/0000775000175000017500000000000012067326706014550 5ustar patrickpatrickPlatform/src/Common/Diagnostics/0000775000175000017500000000000012067326706017017 5ustar patrickpatrickPlatform/src/Common/Diagnostics/Debug.cs0000664000175000017500000000310312067326706020371 0ustar patrickpatrick// Debug.cs // // Copyright (C) 2008 - 2010 Patrick Ulbrich // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // using System; using System.Reflection; namespace Platform.Common.Diagnostics { public static class Debug { public static void Assert(bool condition, string msg) { if (!condition) throw new AssertionFailedException("Assertion failed: " + msg); } public static void WriteLine(string message) { Assembly asm = Assembly.GetCallingAssembly(); WriteLine(asm, message, new object[] {}); } public static void WriteLine(string message, params object[] args) { Assembly asm = Assembly.GetCallingAssembly(); WriteLine(asm, message, args); } private static void WriteLine(Assembly asm, string message, params object[] args) { if (args.Length > 0) message = string.Format(message, args); string appName = asm.GetName().Name; Console.WriteLine("[{0} DBG]: {1}", appName, message); //System.Diagnostics.Debug.WriteLine(message); } } } Platform/src/Common/Diagnostics/CurrentPlatform.cs0000664000175000017500000000261312067326706022477 0ustar patrickpatrick// CurrentPlatform.cs // // Copyright (C) 2008 Patrick Ulbrich // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // using System; namespace Platform.Common.Diagnostics { public static class CurrentPlatform { private static readonly bool isWin32; private static readonly bool isUnix; private static readonly bool isGnome; static CurrentPlatform() { isUnix = Environment.OSVersion.Platform == PlatformID.Unix; // isWin32 = (platform == PlatformID.Win32NT) || (platform == PlatformID.Win32S) || (platform == PlatformID.Win32Windows); isWin32 = !isUnix; isGnome = Environment.OSVersion.Platform == PlatformID.Unix; } public static bool IsWin32 { get { return isWin32; } } public static bool IsUnix { get { return isUnix; } } public static bool IsGnome { get { return isGnome; } } } } Platform/src/Common/Diagnostics/AssertionFailedException.cs0000664000175000017500000000161612067326706024305 0ustar patrickpatrick// AssertionFailedException.cs // // Copyright (C) 2010 Patrick Ulbrich // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // using System; namespace Platform.Common.Diagnostics { public class AssertionFailedException : Exception { public AssertionFailedException (string message) : base(message) {} } } Platform/src/Common/Diagnostics/CurrentRuntime.cs0000664000175000017500000000221412067326706022333 0ustar patrickpatrick// CurrentRuntime.cs // // Copyright (C) 2008 Patrick Ulbrich // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // using System; using System.Reflection; namespace Platform.Common.Diagnostics { public static class CurrentRuntime { //private static Assembly mscorlibAssembly; private static readonly bool isMono; static CurrentRuntime() { Assembly mscorlibAssembly; mscorlibAssembly = typeof(object).Assembly; isMono = (mscorlibAssembly.GetType("System.MonoType") != null); } public static bool IsMono { get { return isMono; } } } } Platform/src/Common/IO/0000775000175000017500000000000012067326706015057 5ustar patrickpatrickPlatform/src/Common/IO/DriveNotReadyException.cs0000664000175000017500000000165412067326706022012 0ustar patrickpatrick// DriveNotReadyException.cs // // Copyright (C) 2008 Patrick Ulbrich // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // using System; namespace Platform.Common.IO { public class DriveNotReadyException : Exception { public DriveNotReadyException() : base() {} public DriveNotReadyException(string message) : base(message) {} } } Platform/src/Common/IO/DriveType.cs0000664000175000017500000000154612067326706017327 0ustar patrickpatrick// DriveType.cs // // Copyright (C) 2008 Patrick Ulbrich // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // using System; namespace Platform.Common.IO { public enum DriveType { Unknown = 0, Removable = 1, Fixed = 2, Network = 3, CDRom = 4, Ram = 5 } } Platform/src/Common/IO/FileHelper.cs0000664000175000017500000000465512067326706017437 0ustar patrickpatrick// FileHelper.cs // // Copyright (C) 2008 - 2010 Patrick Ulbrich // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // using System; #if UNIX using Platform.Unix.IO; #endif namespace Platform.Common.IO { // required to be in sync with Platform.Unix.IO.UnixFileType public enum FileType { Directory, CharacterDevice, BlockDevice, RegularFile, Fifo, SymbolicLink, Socket } public static class FileHelper { public static FileType GetFileType(string path, bool followSymLinks) { #if WIN32 // TODO : test me, is it working? System.IO.FileAttributes attr = System.IO.File.GetAttributes(path); return (attr & System.IO.FileAttributes.Directory) != 0 ? FileType.Directory : FileType.RegularFile; #else Mono.Unix.Native.Stat stat; if (followSymLinks) stat = UnixFileHelper.GetStat(path); else stat = UnixFileHelper.GetLStat(path); FileType ft; UnixFileType uft = UnixFileHelper.GetFileType(stat); switch(uft) { case UnixFileType.Directory: ft = FileType.Directory; break; case UnixFileType.CharacterDevice: ft = FileType.CharacterDevice; break; case UnixFileType.BlockDevice: ft = FileType.BlockDevice; break; case UnixFileType.RegularFile: ft = FileType.RegularFile; break; case UnixFileType.Fifo: ft = FileType.Fifo; break; case UnixFileType.SymbolicLink: ft = FileType.SymbolicLink; break; case UnixFileType.Socket: ft = FileType.Socket; break; default: throw new NotImplementedException(string.Format("UnixFileType {0} has no equivalent FileType value yet", uft.ToString())); } return ft; #endif } public static string GetCanonicalSymLinkTarget(string symLinkPath) { #if WIN32 throw new NotImplementedException(); #else return UnixFileHelper.ReadLink(symLinkPath, true); #endif } } } Platform/src/Common/IO/DriveNotMountedException.cs0000664000175000017500000000166512067326706022363 0ustar patrickpatrick// DriveNotMountedException.cs // // Copyright (C) 2008 Patrick Ulbrich // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // using System; namespace Platform.Common.IO { public class DriveNotMountedException : Exception { public DriveNotMountedException() : base() {} public DriveNotMountedException(string message) : base(message) {} } } Platform/src/Common/IO/IDriveInfoProvider.cs0000664000175000017500000000173512067326706021125 0ustar patrickpatrick// IDriveInfoProvider.cs // // Copyright (C) 2011 Patrick Ulbrich // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // using System; using System.Collections.Generic; namespace Platform.Common.IO { internal interface IDriveInfoProvider { void FromDevice(DriveInfo d, string device); void FromPath(DriveInfo d, string rootPath); List GetAll(bool readyDrivesOnly); } } Platform/src/Common/IO/DriveInfo.cs0000664000175000017500000000756212067326706017305 0ustar patrickpatrick// DriveInfo.cs // // Copyright (C) 2008 - 2011 Patrick Ulbrich // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // using System; namespace Platform.Common.IO { /* * DriveInfo class * * The purpose of this class is to provide similar drive information on all platforms. * It should behave similar to System.IO.DriveInfo on Windows. * E.g. on GNOME, is should return all drives that are listed in Nautilus:Computer. * * On linux it requires Devicekit.Disks to return proper information for propterties * like Device, DriveType and VolumeLabel. * Alternatively, the implementation could be based on Gnome.Vfs.VolumeMonitor, * but this would make it GNOME-dependent * (BAD -> class is used in platform-independed VolumeDB assembly). */ public class DriveInfo { internal string volumeLabel; internal long totalSize; internal string rootPath; // on linux -> mountpoint, on windows e.g. "D:\" internal string device; // on linux -> blockdevice, on windows e.g. "D:" internal DriveType driveType; internal string filesystem; internal bool isMounted; internal bool isReady; internal bool hasAudioCdVolume; private static readonly IDriveInfoProvider dip; static DriveInfo() { #if WIN32 dip = new Platform.Win32.IO.Win32DriveInfoProvider(); #elif GNOME dip = new Platform.Gnome.IO.GioDriveInfoProvider(); #else dip = new Platform.Unix.IO.DkDriveInfoProvider(); #endif } internal DriveInfo() { this.volumeLabel = string.Empty; this.totalSize = 0L; this.rootPath = string.Empty; this.device = string.Empty; this.driveType = DriveType.Unknown; this.filesystem = string.Empty; this.isMounted = false; this.isReady = false; this.hasAudioCdVolume = false; } public DriveInfo(string rootPath) : this() { if (rootPath == null) throw new ArgumentNullException("rootPath"); dip.FromPath(this, rootPath); } public static DriveInfo FromDevice(string device) { if (device == null) throw new ArgumentNullException("device"); DriveInfo d = new DriveInfo(); dip.FromDevice(d, device); return d; } public static DriveInfo[] GetDrives() { return GetDrives(false); } public static DriveInfo[] GetDrives(bool readyDrivesOnly) { return dip.GetAll(readyDrivesOnly).ToArray(); } public string VolumeLabel { get { if (!isReady) throw new DriveNotReadyException(); return volumeLabel; } } public long TotalSize { get { if (!isReady) throw new DriveNotReadyException(); return totalSize; } } public string Device { get { return device; } } public string RootPath { get { if (!isMounted) throw new DriveNotMountedException(); return rootPath; } } public DriveType DriveType { get { return driveType; } } public string FileSystem { get { if (!isReady) throw new DriveNotReadyException(); return filesystem; } } /* E.g. audio cds will not be mounted */ public bool IsMounted { get { return isMounted; } } /* * If drive isn't ready, only volume independent properties may be accessed. * (i.e. only properties related to the drive itself) */ public bool IsReady { get { return isReady; } } public bool HasAudioCdVolume { get { return hasAudioCdVolume; } } } }Platform/src/Common/ThumbnailGenerator.cs0000664000175000017500000000416712067326706020701 0ustar patrickpatrick// ThumbnailGenerator.cs // // Copyright (C) 2008 Patrick Ulbrich // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // using System; using System.IO; namespace Platform.Common { internal interface IThumbnailGenerator : IDisposable { bool GenerateThumbnail(FileInfo fi, string mimeType); void SaveThumbnail(string filename); } public class ThumbnailGenerator : IThumbnailGenerator, IDisposable { private IThumbnailGenerator tg; private bool disposed; public ThumbnailGenerator() { disposed = false; #if GNOME tg = new Platform.Gnome.ThumbnailGenerator(); #elif WIN32 tg = new Platform.Win32.ThumbnailGenerator(); #else tg = null; #endif } public bool GenerateThumbnail(FileInfo fi, string mimeType) { EnsureNotDisposed(); if (fi == null) throw new ArgumentNullException("fi"); if (mimeType == null) throw new ArgumentNullException("mimeType"); if (tg != null) return tg.GenerateThumbnail(fi, mimeType); else return false; } public void SaveThumbnail(string filename) { EnsureNotDisposed(); if (filename == null) throw new ArgumentNullException("filename"); if (tg != null) tg.SaveThumbnail(filename); } public void Dispose() { Dispose(true); } private void Dispose(bool disposing) { if (!disposed) { if (disposing) { if (tg != null) tg.Dispose(); } tg = null; } disposed = true; } private void EnsureNotDisposed() { if (disposed) throw new ObjectDisposedException("ThumbnailGenerator"); } } } Platform/src/Common/Mime/0000775000175000017500000000000012067326706015437 5ustar patrickpatrickPlatform/src/Common/Mime/MimeIconLookup.cs0000664000175000017500000000341612067326706020664 0ustar patrickpatrick// MimeIconLookup.cs // // Copyright (C) 2008, 2012 Patrick Ulbrich // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // using System; using System.Collections.Generic; //#if GNOME //using Platform.Gnome; //#endif namespace Platform.Common.Mime { public class MimeIconLookup { private string defaultIcon; private Dictionary mimeIcons; public MimeIconLookup() { mimeIcons = new Dictionary(); } public string GetIconNameForMimeType(string mimeType) { string iconName; if (mimeType == null) throw new ArgumentNullException("mimeType"); if (mimeType.Length == 0) throw new ArgumentException("Argument is emtpy", "mimeType"); if (mimeIcons.TryGetValue(mimeType, out iconName)) return iconName; #if GNOME GLib.ThemedIcon icon = (GLib.ThemedIcon) GLib.Content.TypeGetIcon(mimeType); foreach (string name in icon.Names) { if (Gtk.IconTheme.Default.HasIcon(name)) { iconName = name; break; } } #else // TODO : find a portable implementation iconName = null; #endif if (!string.IsNullOrEmpty(iconName)) { mimeIcons.Add(mimeType, iconName); } return iconName; } } } Platform/src/Common/Mime/MimeType.cs0000664000175000017500000000376212067326706017527 0ustar patrickpatrick// MimeType.cs // // Copyright (C) 2008, 2012 Patrick Ulbrich // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // using System; namespace Platform.Common.Mime { public static class MimeType { public const string MIME_TYPE_UNKNOWN = "application/octet-stream"; public static string GetMimeTypeForFile(string filename) { string mimeType = null; #if GNOME GLib.File file = GLib.FileFactory.NewForPath(filename); if (file.Exists) { // GLib backend // (null if the file does not exist) GLib.FileInfo info = file.QueryInfo ("standard::content-type", GLib.FileQueryInfoFlags.None, null); mimeType = info.ContentType; } else { // use mono winforms backend as fallack for non-existing files // (also takes filename extension into account, // always returns a mimetype, even if the file does not exist) mimeType = Platform.Unix.Mime.Mime.GetMimeTypeForFile(filename); } #elif UNIX // mono winforms backend // (also takes filename extension into account, // always returns a mimetype, even if the file does not exist) mimeType = Platform.Unix.Mime.Mime.GetMimeTypeForFile(filename); #elif WIN32 // win32 registry backend // (uses filename extension only, always returns a mimetype) mimeType = Platform.Win32.Mime.RegistryMime.GetMimeTypeForExtension(filename); #endif if (mimeType == null) return MIME_TYPE_UNKNOWN; else return mimeType; } } } Platform/src/Common/Globalization/0000775000175000017500000000000012067326706017346 5ustar patrickpatrickPlatform/src/Common/Globalization/Catalog.cs0000664000175000017500000001051212067326706021246 0ustar patrickpatrick// Catalog.cs // // Copyright (C) 2008, 2009, 2011 Patrick Ulbrich // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // // TODO : write an extension method // public static string _(this object o, string msgid) // when mono 2.0 is included in major distros using System; using System.Resources; using System.Reflection; using System.Globalization; namespace Platform.Common.Globalization { public class Catalog { private CultureInfo ci; private ResourceManager rm; private Catalog(CultureInfo ci, ResourceManager rm) { this.ci = ci; this.rm = rm; } public string GetString(string msgid) { if (rm == null) return msgid; string translated = rm.GetString(msgid); return translated ?? msgid; } // returns the actual culture used // (may be different than the requested culture) public CultureInfo Culture { get { // may be null return ci; } } // if useFallbacksOnFailure is set, a Catolog object will be returned in every case: // if the catalog for the requested culture can't be created, it tries to // create a catalog for the parent culture. if this fails as well, it returns a catalog that // returns the orginal, untranslated strings. public static Catalog GetCatalogForCulture(CultureInfo ci, string resourceNamespace, bool useFallbacksOnFailure) { if (ci == null) throw new ArgumentNullException("ci"); if (resourceNamespace == null) throw new ArgumentNullException("resourceNamespace"); Assembly asm = Assembly.GetCallingAssembly(); ResourceManager rm; // try to set sub-language, e.g. "de_CH" rm = GetResourceManagerForCulture(ci.Name, asm, resourceNamespace); if (rm == null ) { if (!useFallbacksOnFailure) return null; // try to set parent language, e.g. "de" ci = ci.Parent; if (ci != null) { rm = GetResourceManagerForCulture(ci.Name, asm, resourceNamespace); if (rm == null) ci = null; } } return new Catalog(ci, rm); } // if useFallbacksOnFailure is set a Catolog object will be returned in every case: // if the catalog for the requested culture name can't be created, // ir returns a catalog that returns the orginal, untranslated strings. public static Catalog GetCatalogForCulture(string name, string resourceNamespace, bool useFallbacksOnFailure) { if (name == null) throw new ArgumentNullException("name"); if (resourceNamespace == null) throw new ArgumentNullException("resourceNamespace"); Assembly asm = Assembly.GetCallingAssembly(); ResourceManager rm; CultureInfo ci = null; rm = GetResourceManagerForCulture(name, asm, resourceNamespace); if (rm == null) { if (!useFallbacksOnFailure) return null; } else { try { // may fail on unsupported culture names like "sr" (serbian) ci = new CultureInfo(name); } catch {} } return new Catalog(ci, rm); } private static ResourceManager GetResourceManagerForCulture(string name, Assembly asm, string resourceNamespace) { string baseName = string.Format("{0}.{1}", resourceNamespace, /* replace minus in sub-languages */ name.Replace('-', '_')); if (asm.GetManifestResourceInfo(baseName + ".resources") != null) return new ResourceManager(baseName, asm); else return null; } } } Platform/src/Common/Globalization/TranslatedStringTable.cs0000664000175000017500000001024012067326706024132 0ustar patrickpatrick// TranslatedStringTable.cs // // Copyright (C) 2008 Patrick Ulbrich // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // using System; using System.Collections; using System.Collections.Generic; namespace Platform.Common.Globalization { public class TranslatedStringTable : IEnumerable> { private List untranslatedStrings; private List translatedStrings; private Dictionary untranslatedIndices; private Dictionary translatedIndices; public TranslatedStringTable() { untranslatedStrings = new List(); translatedStrings = new List(); untranslatedIndices = new Dictionary(); translatedIndices = new Dictionary(); } public void Add(string untranslatedString, string translatedString) { if (untranslatedString == null || translatedString == null) throw new ArgumentNullException(); untranslatedStrings.Add(untranslatedString); translatedStrings.Add(translatedString); untranslatedIndices.Add(translatedString, untranslatedStrings.Count - 1); translatedIndices.Add(untranslatedString, translatedStrings.Count - 1); } public bool Contains(string untranslatedString) { if (untranslatedString == null) throw new ArgumentNullException(); return translatedIndices.ContainsKey(untranslatedString); } public void Clear() { untranslatedStrings.Clear(); translatedStrings.Clear(); untranslatedIndices.Clear(); translatedIndices.Clear(); } public int Count { get { return untranslatedStrings.Count; } } public ICollection UntranslatedStrings { get { return untranslatedStrings; } } public ICollection TranslatedStrings { get { return translatedStrings; } } public string GetUntranslatedString(int idx) { return untranslatedStrings[idx]; } public string GetUntranslatedString(string translatedString) { if (translatedString == null) throw new ArgumentNullException(); int idx = untranslatedIndices[translatedString]; return untranslatedStrings[idx]; } public string GetTranslatedString(int idx) { return translatedStrings[idx]; } public string GetTranslatedString(string untranslatedString) { if (untranslatedString == null) throw new ArgumentNullException(); int idx = translatedIndices[untranslatedString]; return translatedStrings[idx]; } public bool TryGetUntranslatedString(string translatedString, out string untranslatedString) { if (translatedString == null) throw new ArgumentNullException(); int idx; untranslatedString = null; if (!untranslatedIndices.TryGetValue(translatedString, out idx)) return false; untranslatedString = untranslatedStrings[idx]; return true; } public bool TryGetTranslatedString(string untranslatedString, out string translatedString) { if (untranslatedString == null) throw new ArgumentNullException(); int idx; translatedString = null; if (!translatedIndices.TryGetValue(untranslatedString, out idx)) return false; translatedString = translatedStrings[idx]; return true; } public IEnumerator> GetEnumerator() { for (int i = 0; i < untranslatedStrings.Count; i++) { yield return new KeyValuePair(untranslatedStrings[i], translatedStrings[i]); } } IEnumerator IEnumerable.GetEnumerator() { for (int i = 0; i < untranslatedStrings.Count; i++) { yield return new DictionaryEntry(untranslatedStrings[i], translatedStrings[i]); } } } } Platform/src/AssemblyInfo.cs0000664000175000017500000000352712067326706016251 0ustar patrickpatrick// AssemblyInfo.cs // // Copyright (C) 2008 - 2011 Patrick Ulbrich // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // using System.Reflection; using System.Runtime.CompilerServices; // Information about this assembly is defined by the following // attributes. // // change them to the information which is associated with the assembly // you compile. [assembly: AssemblyTitle("Platform")] [assembly: AssemblyDescription("Platform related classes shared among Basenji assemblies")] [assembly: AssemblyConfiguration("")] [assembly: AssemblyCompany("")] [assembly: AssemblyProduct("")] [assembly: AssemblyCopyright("2008 - 2012 Patrick Ulbrich")] [assembly: AssemblyTrademark("")] [assembly: AssemblyCulture("")] // The assembly version has following format : // // Major.Minor.Build.Revision // // You can specify all values by your own or you can build default build and revision // numbers with the '*' character (the default): [assembly: AssemblyVersion("1.0.1")] // The following attributes specify the key for the sign of your assembly. See the // .NET Framework documentation for more information about signing. // This is not required, if you don't want signing let these attributes like they're. [assembly: AssemblyDelaySign(false)] [assembly: AssemblyKeyFile("")] Platform/Platform.mdp0000664000175000017500000001431512067326706015023 0ustar patrickpatrick Platform.Common.DB/0000775000175000017500000000000012067326706014244 5ustar patrickpatrickPlatform.Common.DB/Makefile0000664000175000017500000000724612067326706015715 0ustar patrickpatrick EXTRA_DIST = Makefile # Warning: This is an automatically generated file, do not edit! srcdir=. top_srcdir=.. include $(top_srcdir)/config.make ifeq ($(CONFIG),DEBUG) ASSEMBLY_COMPILER_COMMAND = dmcs ASSEMBLY_COMPILER_FLAGS = -noconfig -codepage:utf8 -warn:3 -optimize- -debug -define:DEBUG "-define:DEBUG,UNIX" ASSEMBLY = bin/Debug/Platform.Common.DB.dll ASSEMBLY_MDB = $(ASSEMBLY).mdb COMPILE_TARGET = library PROJECT_REFERENCES = BUILD_DIR = bin/Debug PLATFORM_COMMON_DB_DLL_MDB_SOURCE=bin/Debug/Platform.Common.DB.dll.mdb PLATFORM_COMMON_DB_DLL_MDB=$(BUILD_DIR)/Platform.Common.DB.dll.mdb endif ifeq ($(CONFIG),RELEASE) ASSEMBLY_COMPILER_COMMAND = dmcs ASSEMBLY_COMPILER_FLAGS = -noconfig -codepage:utf8 -warn:3 -optimize+ "-define:UNIX" ASSEMBLY = bin/Release/Platform.Common.DB.dll ASSEMBLY_MDB = COMPILE_TARGET = library PROJECT_REFERENCES = BUILD_DIR = bin/Release PLATFORM_COMMON_DB_DLL_MDB= endif ifeq ($(CONFIG),GNOME_DEBUG) ASSEMBLY_COMPILER_COMMAND = dmcs ASSEMBLY_COMPILER_FLAGS = -noconfig -codepage:utf8 -warn:3 -optimize- -debug -define:DEBUG "-define:DEBUG,UNIX" ASSEMBLY = bin/Debug/Platform.Common.DB.dll ASSEMBLY_MDB = $(ASSEMBLY).mdb COMPILE_TARGET = library PROJECT_REFERENCES = BUILD_DIR = bin/Debug PLATFORM_COMMON_DB_DLL_MDB_SOURCE=bin/Debug/Platform.Common.DB.dll.mdb PLATFORM_COMMON_DB_DLL_MDB=$(BUILD_DIR)/Platform.Common.DB.dll.mdb endif ifeq ($(CONFIG),GNOME_RELEASE) ASSEMBLY_COMPILER_COMMAND = dmcs ASSEMBLY_COMPILER_FLAGS = -noconfig -codepage:utf8 -warn:3 -optimize+ "-define:UNIX" ASSEMBLY = bin/Release/Platform.Common.DB.dll ASSEMBLY_MDB = COMPILE_TARGET = library PROJECT_REFERENCES = BUILD_DIR = bin/Release PLATFORM_COMMON_DB_DLL_MDB= endif AL=al SATELLITE_ASSEMBLY_NAME=$(notdir $(basename $(ASSEMBLY))).resources.dll PROGRAMFILES = \ $(PLATFORM_COMMON_DB_DLL_MDB) RESGEN=resgen2 FILES = \ src/AssemblyInfo.cs \ src/SqliteDB.cs DATA_FILES = RESOURCES = EXTRAS = REFERENCES = \ System \ System.Data \ Mono.Data.Sqlite DLL_REFERENCES = CLEANFILES = $(PROGRAMFILES) #Targets all: $(ASSEMBLY) $(PROGRAMFILES) $(top_srcdir)/config.make include $(top_srcdir)/Makefile.include #include $(srcdir)/custom-hooks.make $(eval $(call emit_resgen_targets)) $(build_xamlg_list): %.xaml.g.cs: %.xaml xamlg '$<' $(ASSEMBLY_MDB): $(ASSEMBLY) $(ASSEMBLY): $(build_sources) $(build_resources) $(build_datafiles) $(DLL_REFERENCES) $(PROJECT_REFERENCES) $(build_xamlg_list) $(build_satellite_assembly_list) make pre-all-local-hook prefix=$(prefix) mkdir -p $(shell dirname $(ASSEMBLY)) make $(CONFIG)_BeforeBuild $(ASSEMBLY_COMPILER_COMMAND) $(ASSEMBLY_COMPILER_FLAGS) -out:$(ASSEMBLY) -target:$(COMPILE_TARGET) $(build_sources_embed) $(build_resources_embed) $(build_references_ref) make $(CONFIG)_AfterBuild make post-all-local-hook prefix=$(prefix) install-local: $(ASSEMBLY) $(ASSEMBLY_MDB) make pre-install-local-hook prefix=$(prefix) make install-satellite-assemblies prefix=$(prefix) mkdir -p '$(DESTDIR)$(libdir)/$(PACKAGE)' $(call cp,$(ASSEMBLY),$(DESTDIR)$(libdir)/$(PACKAGE)) $(call cp,$(ASSEMBLY_MDB),$(DESTDIR)$(libdir)/$(PACKAGE)) $(call cp,$(PLATFORM_COMMON_DB_DLL_MDB),$(DESTDIR)$(libdir)/$(PACKAGE)) make post-install-local-hook prefix=$(prefix) uninstall-local: $(ASSEMBLY) $(ASSEMBLY_MDB) make pre-uninstall-local-hook prefix=$(prefix) make uninstall-satellite-assemblies prefix=$(prefix) $(call rm,$(ASSEMBLY),$(DESTDIR)$(libdir)/$(PACKAGE)) $(call rm,$(ASSEMBLY_MDB),$(DESTDIR)$(libdir)/$(PACKAGE)) $(call rm,$(PLATFORM_COMMON_DB_DLL_MDB),$(DESTDIR)$(libdir)/$(PACKAGE)) make post-uninstall-local-hook prefix=$(prefix) install: install-local uninstall: uninstall-local clean: clean-local include $(top_srcdir)/rules.make Platform.Common.DB/Platform.Common.DB_win32.csproj0000664000175000017500000000761012067326706022013 0ustar patrickpatrick Debug AnyCPU 9.0.30729 2.0 {6F73D36A-FBE3-410A-8976-00FC87A085CF} Library Properties Platform.Common.DB Platform.Common.DB v4.0 512 3.5 http://localhost/Platform.Common.DB/ true Web true Foreground 7 Days false false true 0 1.0.0.%2a true false true true full false bin\Debug\ TRACE;DEBUG;WIN32 prompt 4 AllRules.ruleset pdbonly true bin\Release\ TRACE;WIN32 prompt 4 AllRules.ruleset D:\basenji_dependencies\System.Data.SQLite.dll False .NET Framework 3.5 SP1 Client Profile false False .NET Framework 3.5 SP1 true False Windows Installer 3.1 true Platform.Common.DB/Platform.Common.DB.mdp0000664000175000017500000000406112067326706020246 0ustar patrickpatrick Platform.Common.DB/src/0000775000175000017500000000000012067326706015033 5ustar patrickpatrickPlatform.Common.DB/src/SqliteDB.cs0000664000175000017500000000460612067326706017037 0ustar patrickpatrick// SqliteDB.cs // // Copyright (C) 2008 Patrick Ulbrich // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // using System; using System.IO; using System.Data; #if WIN32 // requires http://sourceforge.net/projects/sqlite-dotnet2 using System.Data.SQLite; #else using Mono.Data.Sqlite; #endif // TODO : http://www.mono-project.com/SQL_Lite) /* If it finds an integer value, it uses DateTime.FromFileTime, which is the reverse of how it encodes DateTimes if you insert a DateTime via parameters. If it finds a string value, it uses DateTime.Parse, but note that Parse is a very slow operation. So with Sqlite3, DateTimes should be put into DATE or DATETIME columns in the database either through parameters or by turning it into a long with ToFileTime yourself, and then they will be read back as DateTimes. -> Wenn ich das mit ToFileTime() speichere, ist es aber nicht mehr kompatibel mit anderen SQL Servern (z.b. MySQL oder?) -> Betrifft doch eigentlich nur VolumeDatabase.SqlPrepareValue() und CreateTables()(sqlInsert=..) ? Da statt .ToString() .ToFileTime() nutzen? */ namespace Platform.Common.DB { public static class SqliteDB { public static IDbConnection Open(string dbPath, bool create) { if (dbPath == null) throw new ArgumentNullException("dbPath"); if (create) { if (File.Exists(dbPath)) File.Delete(dbPath); #if WIN32 SQLiteConnection.CreateFile(dbPath); #else SqliteConnection.CreateFile(dbPath); #endif } else { if (!File.Exists(dbPath)) throw new FileNotFoundException(string.Format("Database '{0}' not found", dbPath)); } IDbConnection conn; string connStr = string.Format("Data Source={0}", dbPath); #if WIN32 conn = new SQLiteConnection(connStr); #else conn = new SqliteConnection(connStr); #endif conn.Open(); return conn; } } }Platform.Common.DB/src/AssemblyInfo.cs0000664000175000017500000000352012067326706017755 0ustar patrickpatrick// AssemblyInfo.cs // // Copyright (C) 2008 - 2011 Patrick Ulbrich // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // using System.Reflection; using System.Runtime.CompilerServices; // Information about this assembly is defined by the following // attributes. // // change them to the information which is associated with the assembly // you compile. [assembly: AssemblyTitle("Platform.Common.DB")] [assembly: AssemblyDescription("Platfom dependent database connectivity")] [assembly: AssemblyConfiguration("")] [assembly: AssemblyCompany("")] [assembly: AssemblyProduct("")] [assembly: AssemblyCopyright("2008 - 2012 Patrick Ulbrich")] [assembly: AssemblyTrademark("")] [assembly: AssemblyCulture("")] // The assembly version has following format : // // Major.Minor.Build.Revision // // You can specify all values by your own or you can build default build and revision // numbers with the '*' character (the default): [assembly: AssemblyVersion("0.1.1")] // The following attributes specify the key for the sign of your assembly. See the // .NET Framework documentation for more information about signing. // This is not required, if you don't want signing let these attributes like they're. [assembly: AssemblyDelaySign(false)] [assembly: AssemblyKeyFile("")] README0000664000175000017500000000217512067326706011632 0ustar patrickpatrickBasenji - a cross-platform media indexing/search tool http://launchpad.net/basenji GNU/LINUX/GNOME: ================ Requirements: mono (2.4 or later) glib-sharp (2.12.9 or later) gtk-sharp (2.12.9 or later) libgnome-desktop (2.32.0 or later) gio-sharp (2.22.2 or later) dbus-sharp (0.7.0 or later) dbus-sharp-glib (0.7.0 or later) mono-cairo (2.4.2.3 or later) taglib-sharp (>= 2.0.4.0) udisks (1.0.1 or later) Compile: ./configure (non-gnome: ./configure --config=RELEASE) make make install NOTE: if you get a "GLib.GException: Couldn't recognize the image file format for file 'data/basenji.svg'" runtime error, you most likely don't have SVG pixbuf loaders installed (package librsvg2-common in ubuntu). MS Windows: =========== Requirements: .NET 4.0 Framework Gtk# for .NET (http://www.go-mono.com/mono-downloads/download.html) System.Data.SQLite (http://system.data.sqlite.org/index.html/doc/trunk/www/downloads.wiki) taglib-sharp (https://github.com/mono/taglib-sharp) SharpZipLib (http://www.icsharpcode.net/OpenSource/SharpZipLib/Default.aspx) Compile: Open Basenji_win32.sln in Visual Studio 2010. rules.make0000664000175000017500000000212012067326706012731 0ustar patrickpatrickclean-local: make pre-clean-local-hook make $(CONFIG)_BeforeClean -rm -f $(call quote_each,$(CLEANFILES)) make $(CONFIG)_AfterClean make post-clean-local-hook install-local: uninstall-local: q2quote = '$(subst ?, ,$1)' quote_each = $(foreach f,$(call s2q,$1),$(call q2quote,$f)) dist-local: make pre-dist-local-hook "distdir=$$distdir" for f in Makefile $(call quote_each,$(EXTRA_DIST)); do \ d=`dirname "$$f"`; \ test -d "$(distdir)/$$d" || \ mkdir -p "$(distdir)/$$d"; \ cp -p "$$f" "$(distdir)/$$d" || exit 1; \ done make post-dist-local-hook "distdir=$$distdir" dist-local-recursive: for dir in $(call quote_each,$(SUBDIRS)); do \ mkdir -p "$(distdir)/$$dir" || true; \ case "$$dir" in \ .) make dist-local "distdir=$(distdir)" || exit 1;; \ *) (cd "$$dir"; make dist-local "distdir=$(distdir)/$$dir") || exit 1; \ esac \ done #hooks: Available hooks - all, clean, install, uninstall and dist # and their *-local variants pre-%-hook: ; @: post-%-hook: ; @: #targets for custom commands %_BeforeBuild: ; @: %_AfterBuild: ; @: %_BeforeClean: ; @: %_AfterClean: ; @: VolumeDB/0000775000175000017500000000000012067326706012422 5ustar patrickpatrickVolumeDB/VolumeDB_win32.csproj0000664000175000017500000002671112067326706016352 0ustar patrickpatrick Debug AnyCPU 9.0.30729 2.0 {59B6E0D9-AF8C-40B1-A2F3-22C37503174C} Library Properties VolumeDB VolumeDB v4.0 512 3.5 http://localhost/VolumeDB/ true Web true Foreground 7 Days false false true 0 1.0.0.%2a true false true true full false bin\Debug\ DEBUG;TRACE prompt 4 AllRules.ruleset pdbonly true bin\Release\ TRACE prompt 4 AllRules.ruleset {E0C813A2-FCEF-472F-9FE5-DC0CECF8E8B2} MusicBrainz_win32 {6F73D36A-FBE3-410A-8976-00FC87A085CF} Platform.Common.DB_win32 {A8624816-6F0F-42EC-96AE-84C001272CD8} Platform_win32 False D:\basenji_dependencies\ICSharpCode.SharpZipLib.dll 3.5 False D:\basenji_dependencies\taglib-sharp.dll False .NET Framework 3.5 SP1 Client Profile false False .NET Framework 3.5 SP1 true False Windows Installer 3.1 true VolumeDB/Makefile0000664000175000017500000003011612067326706014063 0ustar patrickpatrick EXTRA_DIST = Makefile # Warning: This is an automatically generated file, do not edit! srcdir=. top_srcdir=.. include $(top_srcdir)/config.make ifeq ($(CONFIG),DEBUG) ASSEMBLY_COMPILER_COMMAND = dmcs ASSEMBLY_COMPILER_FLAGS = -noconfig -codepage:utf8 -warn:3 -optimize- -debug "-define:DEBUG" ASSEMBLY = bin/Debug/VolumeDB.dll ASSEMBLY_MDB = $(ASSEMBLY).mdb COMPILE_TARGET = library PROJECT_REFERENCES = \ ../Platform.Common.DB/bin/Debug/Platform.Common.DB.dll \ ../Platform/bin/Debug/Platform.dll \ ../MusicBrainz/bin/Debug/MusicBrainz.dll BUILD_DIR = bin/Debug VOLUMEDB_DLL_MDB_SOURCE=bin/Debug/VolumeDB.dll.mdb VOLUMEDB_DLL_MDB=$(BUILD_DIR)/VolumeDB.dll.mdb PLATFORM_COMMON_DB_DLL_SOURCE=../Platform.Common.DB/bin/Debug/Platform.Common.DB.dll PLATFORM_COMMON_DB_DLL_MDB_SOURCE=../Platform.Common.DB/bin/Debug/Platform.Common.DB.dll.mdb PLATFORM_COMMON_DB_DLL_MDB=$(BUILD_DIR)/Platform.Common.DB.dll.mdb PLATFORM_DLL_SOURCE=../Platform/bin/Debug/Platform.dll PLATFORM_DLL_CONFIG_SOURCE=../Platform/Platform.dll.config PLATFORM_DLL_MDB_SOURCE=../Platform/bin/Debug/Platform.dll.mdb PLATFORM_DLL_MDB=$(BUILD_DIR)/Platform.dll.mdb MUSICBRAINZ_DLL_SOURCE=../MusicBrainz/bin/Debug/MusicBrainz.dll MUSICBRAINZ_DLL_MDB_SOURCE=../MusicBrainz/bin/Debug/MusicBrainz.dll.mdb MUSICBRAINZ_DLL_MDB=$(BUILD_DIR)/MusicBrainz.dll.mdb endif ifeq ($(CONFIG),RELEASE) ASSEMBLY_COMPILER_COMMAND = dmcs ASSEMBLY_COMPILER_FLAGS = -noconfig -codepage:utf8 -warn:3 -optimize+ ASSEMBLY = bin/Release/VolumeDB.dll ASSEMBLY_MDB = COMPILE_TARGET = library PROJECT_REFERENCES = \ ../Platform.Common.DB/bin/Release/Platform.Common.DB.dll \ ../Platform/bin/Release/Platform.dll \ ../MusicBrainz/bin/Release/MusicBrainz.dll BUILD_DIR = bin/Release VOLUMEDB_DLL_MDB= PLATFORM_COMMON_DB_DLL_SOURCE=../Platform.Common.DB/bin/Release/Platform.Common.DB.dll PLATFORM_COMMON_DB_DLL_MDB= PLATFORM_DLL_SOURCE=../Platform/bin/Release/Platform.dll PLATFORM_DLL_CONFIG_SOURCE=../Platform/Platform.dll.config PLATFORM_DLL_MDB= MUSICBRAINZ_DLL_SOURCE=../MusicBrainz/bin/Release/MusicBrainz.dll MUSICBRAINZ_DLL_MDB= endif ifeq ($(CONFIG),GNOME_DEBUG) ASSEMBLY_COMPILER_COMMAND = dmcs ASSEMBLY_COMPILER_FLAGS = -noconfig -codepage:utf8 -warn:3 -optimize- -debug "-define:DEBUG" ASSEMBLY = bin/Debug/VolumeDB.dll ASSEMBLY_MDB = $(ASSEMBLY).mdb COMPILE_TARGET = library PROJECT_REFERENCES = \ ../Platform.Common.DB/bin/Debug/Platform.Common.DB.dll \ ../Platform/bin/Debug/Platform.dll \ ../MusicBrainz/bin/Debug/MusicBrainz.dll BUILD_DIR = bin/Debug VOLUMEDB_DLL_MDB_SOURCE=bin/Debug/VolumeDB.dll.mdb VOLUMEDB_DLL_MDB=$(BUILD_DIR)/VolumeDB.dll.mdb PLATFORM_COMMON_DB_DLL_SOURCE=../Platform.Common.DB/bin/Debug/Platform.Common.DB.dll PLATFORM_COMMON_DB_DLL_MDB_SOURCE=../Platform.Common.DB/bin/Debug/Platform.Common.DB.dll.mdb PLATFORM_COMMON_DB_DLL_MDB=$(BUILD_DIR)/Platform.Common.DB.dll.mdb PLATFORM_DLL_SOURCE=../Platform/bin/Debug/Platform.dll PLATFORM_DLL_CONFIG_SOURCE=../Platform/Platform.dll.config PLATFORM_DLL_MDB_SOURCE=../Platform/bin/Debug/Platform.dll.mdb PLATFORM_DLL_MDB=$(BUILD_DIR)/Platform.dll.mdb MUSICBRAINZ_DLL_SOURCE=../MusicBrainz/bin/Debug/MusicBrainz.dll MUSICBRAINZ_DLL_MDB_SOURCE=../MusicBrainz/bin/Debug/MusicBrainz.dll.mdb MUSICBRAINZ_DLL_MDB=$(BUILD_DIR)/MusicBrainz.dll.mdb endif ifeq ($(CONFIG),GNOME_RELEASE) ASSEMBLY_COMPILER_COMMAND = dmcs ASSEMBLY_COMPILER_FLAGS = -noconfig -codepage:utf8 -warn:3 -optimize+ ASSEMBLY = bin/Release/VolumeDB.dll ASSEMBLY_MDB = COMPILE_TARGET = library PROJECT_REFERENCES = \ ../Platform.Common.DB/bin/Release/Platform.Common.DB.dll \ ../Platform/bin/Release/Platform.dll \ ../MusicBrainz/bin/Release/MusicBrainz.dll BUILD_DIR = bin/Release VOLUMEDB_DLL_MDB= PLATFORM_COMMON_DB_DLL_SOURCE=../Platform.Common.DB/bin/Release/Platform.Common.DB.dll PLATFORM_COMMON_DB_DLL_MDB= PLATFORM_DLL_SOURCE=../Platform/bin/Release/Platform.dll PLATFORM_DLL_CONFIG_SOURCE=../Platform/Platform.dll.config PLATFORM_DLL_MDB= MUSICBRAINZ_DLL_SOURCE=../MusicBrainz/bin/Release/MusicBrainz.dll MUSICBRAINZ_DLL_MDB= endif AL=al SATELLITE_ASSEMBLY_NAME=$(notdir $(basename $(ASSEMBLY))).resources.dll PROGRAMFILES = \ $(VOLUMEDB_DLL_MDB) \ $(PLATFORM_COMMON_DB_DLL) \ $(PLATFORM_COMMON_DB_DLL_MDB) \ $(PLATFORM_DLL) \ $(PLATFORM_DLL_CONFIG) \ $(PLATFORM_DLL_MDB) \ $(MUSICBRAINZ_DLL) \ $(MUSICBRAINZ_DLL_MDB) LINUX_PKGCONFIG = \ $(VOLUMEDB_PC) RESGEN=resgen2 PLATFORM_COMMON_DB_DLL = $(BUILD_DIR)/Platform.Common.DB.dll PLATFORM_DLL = $(BUILD_DIR)/Platform.dll PLATFORM_DLL_CONFIG = $(BUILD_DIR)/Platform.dll.config MUSICBRAINZ_DLL = $(BUILD_DIR)/MusicBrainz.dll VOLUMEDB_PC = $(BUILD_DIR)/volumedb.pc FILES = \ src/Searching/CompareOperator.cs \ src/Searching/ISearchCriteria.cs \ src/Searching/MatchRule.cs \ src/Searching/SearchCriteriaGroup.cs \ src/Searching/TextCompareOperator.cs \ src/VolumeScanner/Events.cs \ src/VolumeScanner/FilesystemVolumeInfo.cs \ src/VolumeScanner/FilesystemVolumeScanner.cs \ src/VolumeScanner/IVolumeScanner.cs \ src/VolumeScanner/VolumeInfo.cs \ src/VolumeScanner/AbstractVolumeScanner.cs \ src/AssemblyInfo.cs \ src/BufferedVolumeItemWriter.cs \ src/DatabaseProperties.cs \ src/DirectoryVolumeItem.cs \ src/FieldnameValuePair.cs \ src/FileSystemVolume.cs \ src/FileSystemVolumeItem.cs \ src/FileVolumeItem.cs \ src/IChildItem.cs \ src/IContainerItem.cs \ src/IHashable.cs \ src/IRecordData.cs \ src/IVolumeDBRecord.cs \ src/UnsupportedDbVersionException.cs \ src/Util.cs \ src/Volume.cs \ src/VolumeDatabase.cs \ src/VolumeDatabase.SqlBackend.cs \ src/VolumeDBDataType.cs \ src/VolumeDriveType.cs \ src/VolumeItem.cs \ src/VolumeItemType.cs \ src/VolumeType.cs \ src/S.cs \ src/Searching/ExcludedSearchCriteria.cs \ src/Searching/EUSL/Parsing/Collect.cs \ src/Searching/EUSL/Parsing/EventHandlers.cs \ src/Searching/EUSL/Parsing/Parser.cs \ src/Searching/EUSL/Parsing/Relation.cs \ src/Searching/EUSL/Parsing/TermType.cs \ src/Searching/EUSL/Parsing/UnexpectedTokenException.cs \ src/Searching/EUSL/Scanning/Scanner.cs \ src/Searching/EUSL/Scanning/ScannerException.cs \ src/Searching/EUSL/Scanning/Token.cs \ src/Searching/EUSL/Scanning/TokenKind.cs \ src/TooManyResultsException.cs \ src/Searching/ItemSearchCriteria/FileSizeSearchCriteria.cs \ src/Searching/ItemSearchCriteria/FreeTextSearchField.cs \ src/Searching/ItemSearchCriteria/IDSearchCriteria.cs \ src/Searching/ItemSearchCriteria/IDSearchField.cs \ src/Searching/ItemSearchCriteria/MediaType.cs \ src/Searching/ItemSearchCriteria/MediaTypeSearchCriteria.cs \ src/Searching/SearchCriteriaType.cs \ src/Searching/ItemSearchCriteria/EUSLSearchCriteria.cs \ src/Searching/VolumeSearchCriteria/QuantitySearchCriteria.cs \ src/Searching/VolumeSearchCriteria/QuantityField.cs \ src/Searching/SearchUtils.cs \ src/Searching/FreeTextSearchCriteria.cs \ src/Searching/IFreeTextSearchField.cs \ src/Searching/VolumeSearchCriteria/FreeTextSearchField.cs \ src/Import/GnomeCatalogImport.cs \ src/Import/BasenjiImport.cs \ src/Import/AbstractImport.cs \ src/Import/Events.cs \ src/Import/CdCollectImport.cs \ src/Import/IImport.cs \ src/DecoderUtility.cs \ src/DbData.cs \ src/VolumeScanner/ScannerOptions.cs \ src/VolumeScanner/FilesystemScannerOptions.cs \ src/VolumeScanner/VolumeProber.cs \ src/VolumeScanner/AudioCdVolumeScanner.cs \ src/VolumeScanner/AudioCdVolumeInfo.cs \ src/VolumeScanner/AudioCdScannerOptions.cs \ src/AudioTrackVolumeItem.cs \ src/AudioCdVolume.cs \ src/AudioCdRootVolumeItem.cs \ src/Searching/VolumeSearchCriteria/EUSLSearchCriteria.cs \ src/Searching/AbstractEUSLSearchCriteria.cs \ src/Global.cs \ src/Metadata/MetadataProvider.cs \ src/Metadata/MetadataType.cs \ src/Metadata/MetadataItem.cs \ src/Metadata/MetadataStore.cs \ src/Metadata/MetadataUtils.cs \ src/Metadata/ArchiveMetadataProvider.cs \ src/Metadata/TagLibMetadataProvider.cs \ src/Import/CdCatImport.cs \ src/Import/ImportException.cs \ src/Import/ImportAttribute.cs \ src/ExtensionMethods.cs DATA_FILES = RESOURCES = \ po/de.resources,VolumeDB.po.de.resources \ po/he.resources,VolumeDB.po.he.resources \ po/da.resources,VolumeDB.po.da.resources \ po/fr.resources,VolumeDB.po.fr.resources \ po/es.resources,VolumeDB.po.es.resources \ po/it.resources,VolumeDB.po.it.resources \ po/bg.resources,VolumeDB.po.bg.resources \ po/oc.resources,VolumeDB.po.oc.resources \ po/pt_BR.resources,VolumeDB.po.pt_BR.resources \ po/tr.resources,VolumeDB.po.tr.resources \ po/pl.resources,VolumeDB.po.pl.resources \ po/hu.resources,VolumeDB.po.hu.resources \ po/et.resources,VolumeDB.po.et.resources \ po/zh_CN.resources,VolumeDB.po.zh_CN.resources \ po/sr.resources,VolumeDB.po.sr.resources \ po/ru.resources,VolumeDB.po.ru.resources \ po/hr.resources,VolumeDB.po.hr.resources \ po/cs.resources,VolumeDB.po.cs.resources \ po/nl.resources,VolumeDB.po.nl.resources \ po/sk.resources,VolumeDB.po.sk.resources EXTRAS = \ volumedb.pc.in REFERENCES = \ System \ System.Data \ System.Core \ -pkg:taglib-sharp \ ICSharpCode.SharpZipLib \ System.Xml DLL_REFERENCES = CLEANFILES = $(PROGRAMFILES) $(LINUX_PKGCONFIG) #Targets all: $(ASSEMBLY) $(PROGRAMFILES) $(LINUX_PKGCONFIG) $(top_srcdir)/config.make include $(top_srcdir)/Makefile.include #include $(srcdir)/custom-hooks.make $(eval $(call emit-deploy-target,PLATFORM_COMMON_DB_DLL)) $(eval $(call emit-deploy-target,PLATFORM_COMMON_DB_DLL_MDB)) $(eval $(call emit-deploy-target,PLATFORM_DLL)) $(eval $(call emit-deploy-target,PLATFORM_DLL_CONFIG)) $(eval $(call emit-deploy-target,PLATFORM_DLL_MDB)) $(eval $(call emit-deploy-target,MUSICBRAINZ_DLL)) $(eval $(call emit-deploy-target,MUSICBRAINZ_DLL_MDB)) $(eval $(call emit-deploy-wrapper,VOLUMEDB_PC,volumedb.pc)) $(eval $(call emit_resgen_targets)) $(build_xamlg_list): %.xaml.g.cs: %.xaml xamlg '$<' $(ASSEMBLY_MDB): $(ASSEMBLY) $(ASSEMBLY): $(build_sources) $(build_resources) $(build_datafiles) $(DLL_REFERENCES) $(PROJECT_REFERENCES) $(build_xamlg_list) $(build_satellite_assembly_list) make pre-all-local-hook prefix=$(prefix) mkdir -p $(shell dirname $(ASSEMBLY)) make $(CONFIG)_BeforeBuild $(ASSEMBLY_COMPILER_COMMAND) $(ASSEMBLY_COMPILER_FLAGS) -out:$(ASSEMBLY) -target:$(COMPILE_TARGET) $(build_sources_embed) $(build_resources_embed) $(build_references_ref) make $(CONFIG)_AfterBuild make post-all-local-hook prefix=$(prefix) install-local: $(ASSEMBLY) $(ASSEMBLY_MDB) make pre-install-local-hook prefix=$(prefix) make install-satellite-assemblies prefix=$(prefix) mkdir -p '$(DESTDIR)$(libdir)/$(PACKAGE)' $(call cp,$(ASSEMBLY),$(DESTDIR)$(libdir)/$(PACKAGE)) $(call cp,$(ASSEMBLY_MDB),$(DESTDIR)$(libdir)/$(PACKAGE)) $(call cp,$(VOLUMEDB_DLL_MDB),$(DESTDIR)$(libdir)/$(PACKAGE)) $(call cp,$(PLATFORM_COMMON_DB_DLL),$(DESTDIR)$(libdir)/$(PACKAGE)) $(call cp,$(PLATFORM_COMMON_DB_DLL_MDB),$(DESTDIR)$(libdir)/$(PACKAGE)) $(call cp,$(PLATFORM_DLL),$(DESTDIR)$(libdir)/$(PACKAGE)) $(call cp,$(PLATFORM_DLL_CONFIG),$(DESTDIR)$(libdir)/$(PACKAGE)) $(call cp,$(PLATFORM_DLL_MDB),$(DESTDIR)$(libdir)/$(PACKAGE)) $(call cp,$(MUSICBRAINZ_DLL),$(DESTDIR)$(libdir)/$(PACKAGE)) $(call cp,$(MUSICBRAINZ_DLL_MDB),$(DESTDIR)$(libdir)/$(PACKAGE)) mkdir -p '$(DESTDIR)$(libdir)/pkgconfig' $(call cp,$(VOLUMEDB_PC),$(DESTDIR)$(libdir)/pkgconfig) make post-install-local-hook prefix=$(prefix) uninstall-local: $(ASSEMBLY) $(ASSEMBLY_MDB) make pre-uninstall-local-hook prefix=$(prefix) make uninstall-satellite-assemblies prefix=$(prefix) $(call rm,$(ASSEMBLY),$(DESTDIR)$(libdir)/$(PACKAGE)) $(call rm,$(ASSEMBLY_MDB),$(DESTDIR)$(libdir)/$(PACKAGE)) $(call rm,$(VOLUMEDB_DLL_MDB),$(DESTDIR)$(libdir)/$(PACKAGE)) $(call rm,$(PLATFORM_COMMON_DB_DLL),$(DESTDIR)$(libdir)/$(PACKAGE)) $(call rm,$(PLATFORM_COMMON_DB_DLL_MDB),$(DESTDIR)$(libdir)/$(PACKAGE)) $(call rm,$(PLATFORM_DLL),$(DESTDIR)$(libdir)/$(PACKAGE)) $(call rm,$(PLATFORM_DLL_CONFIG),$(DESTDIR)$(libdir)/$(PACKAGE)) $(call rm,$(PLATFORM_DLL_MDB),$(DESTDIR)$(libdir)/$(PACKAGE)) $(call rm,$(MUSICBRAINZ_DLL),$(DESTDIR)$(libdir)/$(PACKAGE)) $(call rm,$(MUSICBRAINZ_DLL_MDB),$(DESTDIR)$(libdir)/$(PACKAGE)) $(call rm,$(VOLUMEDB_PC),$(DESTDIR)$(libdir)/pkgconfig) make post-uninstall-local-hook prefix=$(prefix) install: install-local uninstall: uninstall-local clean: clean-local include $(top_srcdir)/rules.make VolumeDB/po/0000775000175000017500000000000012067326706013040 5ustar patrickpatrickVolumeDB/po/hr.resources0000664000175000017500000001126412067326706015411 0ustar patrickpatricklSystem.Resources.ResourceReader, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089#System.Resources.RuntimeResourceSetPADPADP8֞xϴϼƾ_@,ZLxR(I|1 4IY;CKeNNDNcPÇBTUWDXhg\qkdqW*y| < Eh  ^Can't read LastWriteTime from item '{0}' ({1}).jDirectory '{0}' not found. (Wrong filename encoding?)NError connecting to MusicBrainz server. Error opening file '{0}', can't retrieve any mime/metadata. ({1})8`Failed to resolve target item for symlink '{0}'.~`File '{0}' not found. (Wrong filename encoding?)lHashcode generation not implemented for audio cds yet.Invalid compare operator for a keyword that maps to textual content=TInvalid compare operator for keyword '{0}'nKeyword '{0}' only supports the equality operator ('=')`No MusicBrainz metadata available for this disc.Operand for keyword '{0}' must be a number with an optional multiplierDTOperand for keyword '{0}' must be a stringxParsing error: search statement is malformed at position {0}Skipped item '{0}' as it appears to be some kind of special file. zSkipped item '{0}' as it doesn't seem to be a real directory.GSkipped symlink item '{0}' as it appears to point to a different drive ('{1}').vSkipped symlink item '{0}' as it does not point to a regular file ('{1}').pSkipped symlink item '{0}' as the target does not exist.The trackcount retrieved from MusicBrainz does not match the trackcount of the local disc. Skipped.H>Unable to dump dir '{0}'. ({1})*Unknown keyword '{0}'$Unknown type '{0}'Project-Id-Version: basenji Report-Msgid-Bugs-To: FULL NAME POT-Creation-Date: 2012-07-15 15:49+0200 PO-Revision-Date: 2011-03-05 11:28+0000 Last-Translator: Borna Bilas Language-Team: Croatian MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Launchpad-Export-Date: 2012-10-27 11:00+0000 X-Generator: Launchpad (build 16194) ;Nije moguće pročitati LastWriteTime iz stavke '{0}' ({1})5Mapa '{0}' nije nađena. (Pogrešno kodiranje imena?))Greška u spajanju na MusicBrainz server.DGreška u otvaranju '{0}', nije moguće dohvatiti metapodatke. ({1})BNije moguće razriješiti ciljnu stavku za simboličku vezu '{0}'.9Datoteka '{0}' nije nađena. (Pogrešno kodiranje imena?)>Generacija Hash kodova za audio CD-e nije još implementirana.VNevažeći operator uspoređivanja za ključnu riječ mapiranu na tekstualni sadržaj.;Nevažeći operator uspoređivanja za ključnu riječ '{0}'>Ključna riječ '{0}' podržava samo operator jednakosti ('=')0Nema MusicBrainz metapodataka dostupnih za disk.KOperator za ključnu riječ '{0}' mora biti broj s opcionalnim množiteljem2Operator za ključnu riječ '{0}' mora biti stringFGraška u analizi: pojam u pretraživanju je deformiran u poziciji {0}8Prekočena stavka '{0}' jer je nekakva posebna datoteka.-Preskačena stavka '{0}' jer nije prava mapa.GPreskočena simbolička veza '{0}' jer pokazuje na drugi pogon ('{1}').MPreskočena simbolička veza '{0}' jer ne pokazuje normalnu datoteku ('{1}').8Preskočena simbolička veza '{0}' jer cilj nije valjan.aBroj pjesama dobiven od MusicBrainz se ne slaže s brojem pjesama na lokalnom disku. Preskočeno.'Nije moguće odbaciti mapu '{0}'. ({1}) Nepoznata ključna riječ '{0}'.Nepoznata vrsta '{0}'VolumeDB/po/fr.po0000664000175000017500000001400412067326706014006 0ustar patrickpatrick# French translation for basenji # Copyright (c) 2010 Rosetta Contributors and Canonical Ltd 2010 # This file is distributed under the same license as the basenji package. # FIRST AUTHOR , 2010. # msgid "" msgstr "" "Project-Id-Version: basenji\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2012-07-15 15:49+0200\n" "PO-Revision-Date: 2011-11-13 06:47+0000\n" "Last-Translator: Aurélien RIVIERE \n" "Language-Team: French \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2012-10-27 11:00+0000\n" "X-Generator: Launchpad (build 16194)\n" #: src/Searching/VolumeSearchCriteria/EUSLSearchCriteria.cs:74 #: src/Searching/ItemSearchCriteria/EUSLSearchCriteria.cs:65 #, csharp-format msgid "" "Operand for keyword '{0}' must be a number with an optional multiplier" msgstr "" "Opérande pour le mot clé \"{0} 'doit être un nombre avec un coefficient " "multiplicateur en option" #: src/Searching/VolumeSearchCriteria/EUSLSearchCriteria.cs:84 #: src/Searching/ItemSearchCriteria/EUSLSearchCriteria.cs:75 #, csharp-format msgid "Invalid compare operator for keyword '{0}'" msgstr "Opérateur de comparaison invalide pour le mot clé \"{0}\"" #: src/Searching/VolumeSearchCriteria/EUSLSearchCriteria.cs:99 #: src/Searching/ItemSearchCriteria/EUSLSearchCriteria.cs:122 #, csharp-format msgid "Unknown keyword '{0}'" msgstr "Clé inconnu '{0}'" #: src/Searching/VolumeSearchCriteria/EUSLSearchCriteria.cs:109 #: src/Searching/ItemSearchCriteria/EUSLSearchCriteria.cs:133 msgid "Invalid compare operator for a keyword that maps to textual content" msgstr "" "Opérateur de comparaison invalide pour un mot clé qui correspond à contenu " "textuel" #: src/Searching/ItemSearchCriteria/EUSLSearchCriteria.cs:85 #, csharp-format msgid "Operand for keyword '{0}' must be a string" msgstr "Operand for keyword '{0}' must be a string" #: src/Searching/ItemSearchCriteria/EUSLSearchCriteria.cs:94 #, csharp-format msgid "Unknown type '{0}'" msgstr "Type inconnu de '{0} \"" #: src/Searching/ItemSearchCriteria/EUSLSearchCriteria.cs:100 #, csharp-format msgid "Keyword '{0}' only supports the equality operator ('=')" msgstr "Keyword '{0}' only supports the equality operator ('=')" #: src/Searching/AbstractEUSLSearchCriteria.cs:87 #: src/Searching/AbstractEUSLSearchCriteria.cs:91 #, csharp-format msgid "Parsing error: search statement is malformed at position {0}" msgstr "" "Erreur de syntaxe : Déclaration de recherche mal formulé à la position {0}" #: src/VolumeScanner/AudioCdVolumeScanner.cs:55 msgid "Hashcode generation not implemented for audio cds yet." msgstr "" "Génération de la somme de contrôle n'est pas encore implémentée pour les CD " "audio." #: src/VolumeScanner/AudioCdVolumeScanner.cs:97 msgid "No MusicBrainz metadata available for this disc." msgstr "Aucune métadonnée MusicBrainz disponible pour ce disque." #: src/VolumeScanner/AudioCdVolumeScanner.cs:102 msgid "" "The trackcount retrieved from MusicBrainz does not match the trackcount of " "the local disc. Skipped." msgstr "" "Les pistes retrouvées sur le serveur MusicBrainz ne correspondent pas aux " "pistes présentes sur le disque local. Annulé." #: src/VolumeScanner/AudioCdVolumeScanner.cs:125 msgid "Error connecting to MusicBrainz server." msgstr "Erreur lors de la connexion au serveur MusicBrainz..." #: src/VolumeScanner/FilesystemVolumeScanner.cs:165 #, csharp-format msgid "Directory '{0}' not found. (Wrong filename encoding?)" msgstr "Dossier '{0}' non trouvé. (Mauvais encodage de fichier ?)" #: src/VolumeScanner/FilesystemVolumeScanner.cs:174 #, csharp-format msgid "Skipped item '{0}' as it doesn't seem to be a real directory." msgstr "Objet ignoré '{0}' car il ne semble pas être un dossier réel." #: src/VolumeScanner/FilesystemVolumeScanner.cs:195 #: src/VolumeScanner/FilesystemVolumeScanner.cs:340 #, csharp-format msgid "Skipped symlink item '{0}' as the target does not exist." msgstr "lien symbolique ignoré '{0}' la destination n'existe pas." #: src/VolumeScanner/FilesystemVolumeScanner.cs:204 #: src/VolumeScanner/FilesystemVolumeScanner.cs:347 #, csharp-format msgid "" "Skipped symlink item '{0}' as it appears to point to a different drive " "('{1}')." msgstr "" "lien symbolique ignoré '{0}' car il pointe sur un lecteur différent ('{1}')." #: src/VolumeScanner/FilesystemVolumeScanner.cs:245 #, csharp-format msgid "File '{0}' not found. (Wrong filename encoding?)" msgstr "Fichier '{0}' non trouvé. (Mauvais encodage de fichier ?)" #: src/VolumeScanner/FilesystemVolumeScanner.cs:279 #, csharp-format msgid "Extracting metadata from file '{0}' failed. ({1})" msgstr "L'extraction des métadonnées depuis le fichier '{0}' a échoué. ({1})" #: src/VolumeScanner/FilesystemVolumeScanner.cs:310 #, csharp-format msgid "Error opening file '{0}', can't retrieve any mime/metadata. ({1})" msgstr "" "Erreur d'ouverture du fichier '{0}', impossible de récupérer les méta-" "données. ({1})" #: src/VolumeScanner/FilesystemVolumeScanner.cs:354 #, csharp-format msgid "" "Skipped symlink item '{0}' as it does not point to a regular file ('{1}')." msgstr "" "Lien symbolique ignoré '{0}' car il ne pointe pas vers un fichier standard " "('{1}')." #: src/VolumeScanner/FilesystemVolumeScanner.cs:363 #, csharp-format msgid "Skipped item '{0}' as it appears to be some kind of special file." msgstr "Objet ignoré '{0}' car il semble être une sorte de fichier spécial." #: src/VolumeScanner/FilesystemVolumeScanner.cs:381 #, csharp-format msgid "Unable to dump dir '{0}'. ({1})" msgstr "Impossible de supprimer le dossier '{0}'. ({1})" #: src/VolumeScanner/FilesystemVolumeScanner.cs:500 #, csharp-format msgid "Can't read LastWriteTime from item '{0}' ({1})." msgstr "" "Impossible de lire l'heure de dernier enregistrement pour cet objet '{0}' " "({1})." #: src/VolumeScanner/FilesystemVolumeScanner.cs:664 #, csharp-format msgid "Failed to resolve target item for symlink '{0}'." msgstr "Impossible de résoudre l'objet cible de lien symbolique '{0}'." VolumeDB/po/pl.resources0000664000175000017500000001141112067326706015405 0ustar patrickpatricklSystem.Resources.ResourceReader, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089#System.Resources.RuntimeResourceSetPADPADP8֞xϴϼƾ_@,ZLxR(I|1 4IY;CKeNNDNcPÇBTUWDXhg\qkdqW*y| < Eh  ^Can't read LastWriteTime from item '{0}' ({1}).jDirectory '{0}' not found. (Wrong filename encoding?)NError connecting to MusicBrainz server.#Error opening file '{0}', can't retrieve any mime/metadata. ({1})U`Failed to resolve target item for symlink '{0}'.`File '{0}' not found. (Wrong filename encoding?)lHashcode generation not implemented for audio cds yet.Invalid compare operator for a keyword that maps to textual contentVTInvalid compare operator for keyword '{0}'nKeyword '{0}' only supports the equality operator ('=')`No MusicBrainz metadata available for this disc.-Operand for keyword '{0}' must be a number with an optional multiplierdTOperand for keyword '{0}' must be a stringxParsing error: search statement is malformed at position {0}Skipped item '{0}' as it appears to be some kind of special file.MzSkipped item '{0}' as it doesn't seem to be a real directory.Skipped symlink item '{0}' as it appears to point to a different drive ('{1}').Skipped symlink item '{0}' as it does not point to a regular file ('{1}').pSkipped symlink item '{0}' as the target does not exist.bThe trackcount retrieved from MusicBrainz does not match the trackcount of the local disc. Skipped.>Unable to dump dir '{0}'. ({1})*Unknown keyword '{0}'7$Unknown type '{0}'NProject-Id-Version: basenji Report-Msgid-Bugs-To: FULL NAME POT-Creation-Date: 2012-07-15 15:49+0200 PO-Revision-Date: 2010-12-20 19:23+0000 Last-Translator: Piotr Strębski Language-Team: Polish MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Launchpad-Export-Date: 2012-10-27 11:00+0000 X-Generator: Launchpad (build 16194) INie udało się odczytać Czasu Ostatniego Zapisu z elementu '{0}' ({1}).4Katalog '{0}' nie znaleziony. (Złe kodowanie nazw?)0Błąd przy połączeniu z serwerem MusicBrainz.UNie udało się otworzyć pliku '{0}', nie udało się pobrać mime/metadanych. ({1})1Nie udało się pobrać celu z dowiązania '{0}'.1Plik '{0}' nie znaleziony. (Złe kodowanie nazw?)BGenerowanie hash jest niezaimplementowane jeszcze dla płyt audio.XNieprawidłowy operator porównania dla słowa, które wskazuje na zawartość tekstową4Nieprawidłowy operator porównania dla słowa '{0}'ESłowo kluczowe '{0}' wspiera jedynie operator równoważności ('=')5Nie znaleziono metadanych MusicBrainz dla tego dysku.PArgument dla słowa kluczowego '{0}' musi być liczbą z ewentualnym mnożnikiemAArgument dla słowa kluczowego '{0}' musi być ciągiem tekstowymRBłąd analizy składni: wyszukiwane wyrażenie jest nieprawidłowe na pozycji {0}>Pominięty element '{0}' wygląda na rodzaj specjalnego pliku.Pominięto dowiązanie '{0}', ponieważ jego cel nie istnieje.bLiczba ścieżek pobrana z MusicBrainz nie jest taka sama jak liczba ścieżek płyty. Pominięto./Nie udało się opuścić katalogu '{0}'. ({1})Nieznane słowo '{0}'Nieznany typ '{0}'VolumeDB/po/et.resources0000664000175000017500000001110312067326706015400 0ustar patrickpatricklSystem.Resources.ResourceReader, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089#System.Resources.RuntimeResourceSetPADPADP8֞xϴϼƾ_@,ZLxR(I|1 4IY;CKeNNDNcPÇBTUWDXhg\qkdqW*y| < Eh  ^Can't read LastWriteTime from item '{0}' ({1}).jDirectory '{0}' not found. (Wrong filename encoding?)NError connecting to MusicBrainz server. Error opening file '{0}', can't retrieve any mime/metadata. ({1})=`Failed to resolve target item for symlink '{0}'.`File '{0}' not found. (Wrong filename encoding?)lHashcode generation not implemented for audio cds yet.Invalid compare operator for a keyword that maps to textual content&TInvalid compare operator for keyword '{0}'lnKeyword '{0}' only supports the equality operator ('=')`No MusicBrainz metadata available for this disc.Operand for keyword '{0}' must be a number with an optional multiplierTOperand for keyword '{0}' must be a stringHxParsing error: search statement is malformed at position {0}wSkipped item '{0}' as it appears to be some kind of special file.zSkipped item '{0}' as it doesn't seem to be a real directory.Skipped symlink item '{0}' as it appears to point to a different drive ('{1}').%Skipped symlink item '{0}' as it does not point to a regular file ('{1}').epSkipped symlink item '{0}' as the target does not exist.The trackcount retrieved from MusicBrainz does not match the trackcount of the local disc. Skipped.>Unable to dump dir '{0}'. ({1})?*Unknown keyword '{0}'j$Unknown type '{0}'Project-Id-Version: basenji Report-Msgid-Bugs-To: FULL NAME POT-Creation-Date: 2012-07-15 15:49+0200 PO-Revision-Date: 2010-10-09 21:43+0000 Last-Translator: olavi tohver Language-Team: Estonian MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Launchpad-Export-Date: 2012-10-27 11:00+0000 X-Generator: Launchpad (build 16194) ;Ei saanud lugeda viimast muutmisaega elemendist '{0}' ({1})3Kausta '{0}' ei leitud. (Vale failinime kodeering?)/Viga ühenduse loomisel MusicBrainz serverisse.DViga faili '{0}' avamisel, ei suutnud hankida mime/metaandmeid.({1})3Ebaõnnestus leida sihtmärk nimeviida '{0}' jaoks.2Faili '{0}' ei leitud. (Vale failinime kodeering?)8Kontrollsumma loomine audio-cd jaoks pole toetatud veel.DVale võrdlusoperaator märksõnale, mis osutab tekstilisele sisule.)Vale võrdlusoperaator märksõnale '{0}'8Märksõna '{0}' toetab ainult võrdsusoperaatorit ('=')2MusicBrainz metaandmeid pole ketta jaoks saadaval.AOperand märksõnale '{0}' peab olema number täiendava kordajaga-Operand märksõnale '{0}' peab olema string3Parsimise viga: otsingusõna on vigane asukohal {0}9Eirati element '{0}' ,sest see tundub olema tähtis fail.Eirati nimeviit '{0}' kuna see viitab teisele kettale ('{1}').DEirati nimeviit '{0}', sest see ei viita tavalisele failile ('{1}').1Eirati nimeviit '{0}', sest sihtmärki ei leitud._MusicBrainz-ist hangitud loojärjestus ei kattu kohaliku ketta loojärjestusele. Vahelejäetud.)Võimatu luua kaustatõmmist '{0}'. ({1})Tundmatu märksõna '{0}'Tundmatu tüüp '{0}'VolumeDB/po/tr.resources0000664000175000017500000000320412067326706015420 0ustar patrickpatricklSystem.Resources.ResourceReader, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089#System.Resources.RuntimeResourceSetPADPADPCKNÇBTDXhg\qkdqtb3,jDirectory '{0}' not found. (Wrong filename encoding?)NError connecting to MusicBrainz server.`File '{0}' not found. (Wrong filename encoding?)Skipped item '{0}' as it appears to be some kind of special file.=zSkipped item '{0}' as it doesn't seem to be a real directory.*Unknown keyword '{0}'$Unknown type '{0}'Project-Id-Version: basenji Report-Msgid-Bugs-To: FULL NAME POT-Creation-Date: 2012-07-15 15:49+0200 PO-Revision-Date: 2010-07-10 13:42+0000 Last-Translator: Cihan Ersoy Language-Team: Turkish MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Launchpad-Export-Date: 2012-10-27 11:00+0000 X-Generator: Launchpad (build 16194) :'{0}' dizini bulunamadı. (Hatalı dosya ismi kodlaması?))MusicBrainz sunucusuna bağlanma hatası.<'{0}' dosyası bulunamadı. (Hatalı dosya ismi kodlaması?)CÖzel bir dosya gibi gözüktüğü için '{0}' ögesi atlanıldı.EGerçek bir dizin gibi gözükmediği için '{0}' ögesi atlanıldı.!Bilinmeyen '{0}' anahtar kelimesiBilinmeyen '{0}' türüVolumeDB/po/es.resources0000664000175000017500000001223312067326706015404 0ustar patrickpatricklSystem.Resources.ResourceReader, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089#System.Resources.RuntimeResourceSetPADPADP8֞xϴϼƾ_@,ZLxR(I|1 4IY;CKeNNDNcPÇBTUWDXhgCh\qkdqT93 * $q ~hB y ^Can't read LastWriteTime from item '{0}' ({1}).jDirectory '{0}' not found. (Wrong filename encoding?)NError connecting to MusicBrainz server.,Error opening file '{0}', can't retrieve any mime/metadata. ({1})^bExtracting metadata from file '{0}' failed. ({1})`Failed to resolve target item for symlink '{0}'.`File '{0}' not found. (Wrong filename encoding?)<lHashcode generation not implemented for audio cds yet.Invalid compare operator for a keyword that maps to textual contentTInvalid compare operator for keyword '{0}'5nKeyword '{0}' only supports the equality operator ('=')w`No MusicBrainz metadata available for this disc.Operand for keyword '{0}' must be a number with an optional multiplierTOperand for keyword '{0}' must be a stringZxParsing error: search statement is malformed at position {0}Skipped item '{0}' as it appears to be some kind of special file.zSkipped item '{0}' as it doesn't seem to be a real directory.USkipped symlink item '{0}' as it appears to point to a different drive ('{1}').Skipped symlink item '{0}' as it does not point to a regular file ('{1}').pSkipped symlink item '{0}' as the target does not exist.ZThe trackcount retrieved from MusicBrainz does not match the trackcount of the local disc. Skipped.>Unable to dump dir '{0}'. ({1})*Unknown keyword '{0}'H$Unknown type '{0}'kProject-Id-Version: basenji Report-Msgid-Bugs-To: FULL NAME POT-Creation-Date: 2012-07-15 15:49+0200 PO-Revision-Date: 2011-08-22 07:01+0000 Last-Translator: Alfredo Hernández Language-Team: Spanish MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Launchpad-Export-Date: 2012-11-18 12:32+0000 X-Generator: Launchpad (build 16278) :No se puede leer LastWriteTime del elemento «{0}» ({1}).ODirectorio «{0}» no encontrado. (¿Mala codificación del nombre de archivo?)0Error al conectarse con el servidor MusicBrainz.UError al abrir el archivo «{0}», no se puede recuperar ningún MIME/metadato. ({1})ELa extracción de los metadatos del archivo «{0}» ha fallado. ({1})>Error al resolver el elemento destino para el symlink «{0}».UNo se ha encontrado el archivo «{0}». (¿Mala codificación del nombre de archivo?)CGeneración de código hash aún no implementada para CDs de audio.[Operador de comparación no válido para una palabra clave que mapea a contenido contextual@Operador de comparación inválido para la palabra clave «{0}»FLa palabra clave «{0}» sólo soporta operadores de igualación ('=')Unable to dump dir '{0}'. ({1})*Unknown keyword '{0}'$Unknown type '{0}'Project-Id-Version: basenji Report-Msgid-Bugs-To: FULL NAME POT-Creation-Date: 2012-07-15 15:49+0200 PO-Revision-Date: 2011-09-07 13:10+0000 Last-Translator: Marcos Oliveira da Cruz Language-Team: Brazilian Portuguese MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Launchpad-Export-Date: 2012-10-27 11:00+0000 X-Generator: Launchpad (build 16194) ?Não foi possível ler HoraDaUltimaEscrita do item '{0}' ({1}).ODiretório '{0}' não encontrado. (Codificação do nome do arquivo incorreta?))Erro ao conectar ao servidor MusicBrainz.TErro carregando o arquivo '{0}', não foi possível obter dados mime/metadata. ({1})2Extraindo metadados do arquivo '{0}' falhou. ({1})5Falha ao resolver o destino do link simbólico '{0}'.IArquivo '{0}' não encontrado. (Codificação do nome do arquivo errada?)BGeração do hash ainda não está implementada para CDs de áudioWOperador de comparação inválido para uma palavra-chave que mapeia o contexto textual=Operador de comparação inválido para a palavra-chave '{0}'@Palavra-chave '{0}' suporta apenas o operador de igualdade ('=')?Não há metadados do MusicBrainz disponíveis para este disco.WOperando para a palavra-chave '{0}' tem de ser um número com um multiplicador opcional9Operando para a palavra-chave '{0}' tem de ser uma stringJErro na análise: afirmação de procura está malformada na posição {0}AItem '{0}' pulado pois parece ser algum tipo de arquivo especial., 2010. # msgid "" msgstr "" "Project-Id-Version: basenji\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2012-07-15 15:49+0200\n" "PO-Revision-Date: 2010-12-12 05:49+0000\n" "Last-Translator: Li Jin \n" "Language-Team: Chinese (Simplified) \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2012-10-27 11:00+0000\n" "X-Generator: Launchpad (build 16194)\n" #: src/Searching/VolumeSearchCriteria/EUSLSearchCriteria.cs:74 #: src/Searching/ItemSearchCriteria/EUSLSearchCriteria.cs:65 #, csharp-format msgid "" "Operand for keyword '{0}' must be a number with an optional multiplier" msgstr "" #: src/Searching/VolumeSearchCriteria/EUSLSearchCriteria.cs:84 #: src/Searching/ItemSearchCriteria/EUSLSearchCriteria.cs:75 #, csharp-format msgid "Invalid compare operator for keyword '{0}'" msgstr "" #: src/Searching/VolumeSearchCriteria/EUSLSearchCriteria.cs:99 #: src/Searching/ItemSearchCriteria/EUSLSearchCriteria.cs:122 #, csharp-format msgid "Unknown keyword '{0}'" msgstr "未知关键字 '{0}'" #: src/Searching/VolumeSearchCriteria/EUSLSearchCriteria.cs:109 #: src/Searching/ItemSearchCriteria/EUSLSearchCriteria.cs:133 msgid "Invalid compare operator for a keyword that maps to textual content" msgstr "" #: src/Searching/ItemSearchCriteria/EUSLSearchCriteria.cs:85 #, csharp-format msgid "Operand for keyword '{0}' must be a string" msgstr "" #: src/Searching/ItemSearchCriteria/EUSLSearchCriteria.cs:94 #, csharp-format msgid "Unknown type '{0}'" msgstr "未知类型 '{0}'" #: src/Searching/ItemSearchCriteria/EUSLSearchCriteria.cs:100 #, csharp-format msgid "Keyword '{0}' only supports the equality operator ('=')" msgstr "" #: src/Searching/AbstractEUSLSearchCriteria.cs:87 #: src/Searching/AbstractEUSLSearchCriteria.cs:91 #, csharp-format msgid "Parsing error: search statement is malformed at position {0}" msgstr "" #: src/VolumeScanner/AudioCdVolumeScanner.cs:55 msgid "Hashcode generation not implemented for audio cds yet." msgstr "" #: src/VolumeScanner/AudioCdVolumeScanner.cs:97 msgid "No MusicBrainz metadata available for this disc." msgstr "" #: src/VolumeScanner/AudioCdVolumeScanner.cs:102 msgid "" "The trackcount retrieved from MusicBrainz does not match the trackcount of " "the local disc. Skipped." msgstr "" #: src/VolumeScanner/AudioCdVolumeScanner.cs:125 msgid "Error connecting to MusicBrainz server." msgstr "连接到 MusicBrainz 服务器出错。" #: src/VolumeScanner/FilesystemVolumeScanner.cs:165 #, csharp-format msgid "Directory '{0}' not found. (Wrong filename encoding?)" msgstr "" #: src/VolumeScanner/FilesystemVolumeScanner.cs:174 #, csharp-format msgid "Skipped item '{0}' as it doesn't seem to be a real directory." msgstr "" #: src/VolumeScanner/FilesystemVolumeScanner.cs:195 #: src/VolumeScanner/FilesystemVolumeScanner.cs:340 #, csharp-format msgid "Skipped symlink item '{0}' as the target does not exist." msgstr "" #: src/VolumeScanner/FilesystemVolumeScanner.cs:204 #: src/VolumeScanner/FilesystemVolumeScanner.cs:347 #, csharp-format msgid "" "Skipped symlink item '{0}' as it appears to point to a different drive " "('{1}')." msgstr "" #: src/VolumeScanner/FilesystemVolumeScanner.cs:245 #, csharp-format msgid "File '{0}' not found. (Wrong filename encoding?)" msgstr "" #: src/VolumeScanner/FilesystemVolumeScanner.cs:279 #, csharp-format msgid "Extracting metadata from file '{0}' failed. ({1})" msgstr "" #: src/VolumeScanner/FilesystemVolumeScanner.cs:310 #, csharp-format msgid "Error opening file '{0}', can't retrieve any mime/metadata. ({1})" msgstr "" #: src/VolumeScanner/FilesystemVolumeScanner.cs:354 #, csharp-format msgid "" "Skipped symlink item '{0}' as it does not point to a regular file ('{1}')." msgstr "" #: src/VolumeScanner/FilesystemVolumeScanner.cs:363 #, csharp-format msgid "Skipped item '{0}' as it appears to be some kind of special file." msgstr "" #: src/VolumeScanner/FilesystemVolumeScanner.cs:381 #, csharp-format msgid "Unable to dump dir '{0}'. ({1})" msgstr "" #: src/VolumeScanner/FilesystemVolumeScanner.cs:500 #, csharp-format msgid "Can't read LastWriteTime from item '{0}' ({1})." msgstr "" #: src/VolumeScanner/FilesystemVolumeScanner.cs:664 #, csharp-format msgid "Failed to resolve target item for symlink '{0}'." msgstr "" VolumeDB/po/bg.po0000664000175000017500000001073312067326706013774 0ustar patrickpatrick# Bulgarian translation for basenji # Copyright (c) 2010 Rosetta Contributors and Canonical Ltd 2010 # This file is distributed under the same license as the basenji package. # FIRST AUTHOR , 2010. # msgid "" msgstr "" "Project-Id-Version: basenji\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2012-07-15 15:49+0200\n" "PO-Revision-Date: 2010-04-22 13:42+0000\n" "Last-Translator: svilborg \n" "Language-Team: Bulgarian \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2012-10-27 11:00+0000\n" "X-Generator: Launchpad (build 16194)\n" #: src/Searching/VolumeSearchCriteria/EUSLSearchCriteria.cs:74 #: src/Searching/ItemSearchCriteria/EUSLSearchCriteria.cs:65 #, csharp-format msgid "" "Operand for keyword '{0}' must be a number with an optional multiplier" msgstr "" #: src/Searching/VolumeSearchCriteria/EUSLSearchCriteria.cs:84 #: src/Searching/ItemSearchCriteria/EUSLSearchCriteria.cs:75 #, csharp-format msgid "Invalid compare operator for keyword '{0}'" msgstr "" #: src/Searching/VolumeSearchCriteria/EUSLSearchCriteria.cs:99 #: src/Searching/ItemSearchCriteria/EUSLSearchCriteria.cs:122 #, csharp-format msgid "Unknown keyword '{0}'" msgstr "" #: src/Searching/VolumeSearchCriteria/EUSLSearchCriteria.cs:109 #: src/Searching/ItemSearchCriteria/EUSLSearchCriteria.cs:133 msgid "Invalid compare operator for a keyword that maps to textual content" msgstr "" #: src/Searching/ItemSearchCriteria/EUSLSearchCriteria.cs:85 #, csharp-format msgid "Operand for keyword '{0}' must be a string" msgstr "" #: src/Searching/ItemSearchCriteria/EUSLSearchCriteria.cs:94 #, csharp-format msgid "Unknown type '{0}'" msgstr "" #: src/Searching/ItemSearchCriteria/EUSLSearchCriteria.cs:100 #, csharp-format msgid "Keyword '{0}' only supports the equality operator ('=')" msgstr "" #: src/Searching/AbstractEUSLSearchCriteria.cs:87 #: src/Searching/AbstractEUSLSearchCriteria.cs:91 #, csharp-format msgid "Parsing error: search statement is malformed at position {0}" msgstr "" #: src/VolumeScanner/AudioCdVolumeScanner.cs:55 msgid "Hashcode generation not implemented for audio cds yet." msgstr "" #: src/VolumeScanner/AudioCdVolumeScanner.cs:97 msgid "No MusicBrainz metadata available for this disc." msgstr "" #: src/VolumeScanner/AudioCdVolumeScanner.cs:102 msgid "" "The trackcount retrieved from MusicBrainz does not match the trackcount of " "the local disc. Skipped." msgstr "" #: src/VolumeScanner/AudioCdVolumeScanner.cs:125 msgid "Error connecting to MusicBrainz server." msgstr "Грешка при заявка към сървъра на MusicBrainz." #: src/VolumeScanner/FilesystemVolumeScanner.cs:165 #, csharp-format msgid "Directory '{0}' not found. (Wrong filename encoding?)" msgstr "" #: src/VolumeScanner/FilesystemVolumeScanner.cs:174 #, csharp-format msgid "Skipped item '{0}' as it doesn't seem to be a real directory." msgstr "" #: src/VolumeScanner/FilesystemVolumeScanner.cs:195 #: src/VolumeScanner/FilesystemVolumeScanner.cs:340 #, csharp-format msgid "Skipped symlink item '{0}' as the target does not exist." msgstr "" #: src/VolumeScanner/FilesystemVolumeScanner.cs:204 #: src/VolumeScanner/FilesystemVolumeScanner.cs:347 #, csharp-format msgid "" "Skipped symlink item '{0}' as it appears to point to a different drive " "('{1}')." msgstr "" #: src/VolumeScanner/FilesystemVolumeScanner.cs:245 #, csharp-format msgid "File '{0}' not found. (Wrong filename encoding?)" msgstr "" #: src/VolumeScanner/FilesystemVolumeScanner.cs:279 #, csharp-format msgid "Extracting metadata from file '{0}' failed. ({1})" msgstr "" #: src/VolumeScanner/FilesystemVolumeScanner.cs:310 #, csharp-format msgid "Error opening file '{0}', can't retrieve any mime/metadata. ({1})" msgstr "" #: src/VolumeScanner/FilesystemVolumeScanner.cs:354 #, csharp-format msgid "" "Skipped symlink item '{0}' as it does not point to a regular file ('{1}')." msgstr "" #: src/VolumeScanner/FilesystemVolumeScanner.cs:363 #, csharp-format msgid "Skipped item '{0}' as it appears to be some kind of special file." msgstr "" #: src/VolumeScanner/FilesystemVolumeScanner.cs:381 #, csharp-format msgid "Unable to dump dir '{0}'. ({1})" msgstr "" #: src/VolumeScanner/FilesystemVolumeScanner.cs:500 #, csharp-format msgid "Can't read LastWriteTime from item '{0}' ({1})." msgstr "" #: src/VolumeScanner/FilesystemVolumeScanner.cs:664 #, csharp-format msgid "Failed to resolve target item for symlink '{0}'." msgstr "" VolumeDB/po/sk.po0000664000175000017500000001373112067326706014022 0ustar patrickpatrick# Slovak translation for basenji # Copyright (c) 2012 Rosetta Contributors and Canonical Ltd 2012 # This file is distributed under the same license as the basenji package. # FIRST AUTHOR , 2012. # msgid "" msgstr "" "Project-Id-Version: basenji\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2012-07-15 15:49+0200\n" "PO-Revision-Date: 2012-07-21 22:44+0000\n" "Last-Translator: Izidor Matušov \n" "Language-Team: Slovak \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2012-10-27 11:00+0000\n" "X-Generator: Launchpad (build 16194)\n" #: src/Searching/VolumeSearchCriteria/EUSLSearchCriteria.cs:74 #: src/Searching/ItemSearchCriteria/EUSLSearchCriteria.cs:65 #, csharp-format msgid "" "Operand for keyword '{0}' must be a number with an optional multiplier" msgstr "Operand pre kľúčové slovo '{0}' musí byť číslo s prípadným násobkom" #: src/Searching/VolumeSearchCriteria/EUSLSearchCriteria.cs:84 #: src/Searching/ItemSearchCriteria/EUSLSearchCriteria.cs:75 #, csharp-format msgid "Invalid compare operator for keyword '{0}'" msgstr "Neplatný operátor porovnávania pre kľúčové slovo '{0}'" #: src/Searching/VolumeSearchCriteria/EUSLSearchCriteria.cs:99 #: src/Searching/ItemSearchCriteria/EUSLSearchCriteria.cs:122 #, csharp-format msgid "Unknown keyword '{0}'" msgstr "Neznáme kľúčové slovo '{0}'" #: src/Searching/VolumeSearchCriteria/EUSLSearchCriteria.cs:109 #: src/Searching/ItemSearchCriteria/EUSLSearchCriteria.cs:133 msgid "Invalid compare operator for a keyword that maps to textual content" msgstr "" "Nie je možné použiť operátor porovnávania pre kľúčové slovo, ktoré sa viaže " "na textový obsah." #: src/Searching/ItemSearchCriteria/EUSLSearchCriteria.cs:85 #, csharp-format msgid "Operand for keyword '{0}' must be a string" msgstr "Operand pre kľúčové slovo '{0}' musí byť reťazec." #: src/Searching/ItemSearchCriteria/EUSLSearchCriteria.cs:94 #, csharp-format msgid "Unknown type '{0}'" msgstr "Neznámy typ '{0}'" #: src/Searching/ItemSearchCriteria/EUSLSearchCriteria.cs:100 #, csharp-format msgid "Keyword '{0}' only supports the equality operator ('=')" msgstr "Kľúčové slovo '{0}'podporuje iba operátor rovnosti ('=')" #: src/Searching/AbstractEUSLSearchCriteria.cs:87 #: src/Searching/AbstractEUSLSearchCriteria.cs:91 #, csharp-format msgid "Parsing error: search statement is malformed at position {0}" msgstr "Chyba spracovania: príkaz vyhľadávania je chybný na pozícií {0}" #: src/VolumeScanner/AudioCdVolumeScanner.cs:55 msgid "Hashcode generation not implemented for audio cds yet." msgstr "Geneorvanie hash kódov pre zvukové CD nie je ešte implementované." #: src/VolumeScanner/AudioCdVolumeScanner.cs:97 msgid "No MusicBrainz metadata available for this disc." msgstr "Pre tento disk nie sú dostupné žiadne metadáta z MusicBrainz" #: src/VolumeScanner/AudioCdVolumeScanner.cs:102 msgid "" "The trackcount retrieved from MusicBrainz does not match the trackcount of " "the local disc. Skipped." msgstr "" "Počet skladieb získaný z MusicBrainz sa nezhoduje s počtom skladieb na " "lokálnom disky. Preskakujem." #: src/VolumeScanner/AudioCdVolumeScanner.cs:125 msgid "Error connecting to MusicBrainz server." msgstr "Nastala chyba pri pripájaní k serveru MusicBrainz" #: src/VolumeScanner/FilesystemVolumeScanner.cs:165 #, csharp-format msgid "Directory '{0}' not found. (Wrong filename encoding?)" msgstr "Adresár '{0}' nebol nájdený. (Možno zlé kódovanie názvu súboru?)" #: src/VolumeScanner/FilesystemVolumeScanner.cs:174 #, csharp-format msgid "Skipped item '{0}' as it doesn't seem to be a real directory." msgstr "Preskakujem položku '{0}', pretože nie je skutočným adresárom." #: src/VolumeScanner/FilesystemVolumeScanner.cs:195 #: src/VolumeScanner/FilesystemVolumeScanner.cs:340 #, csharp-format msgid "Skipped symlink item '{0}' as the target does not exist." msgstr "Preskakujem neplatný symbolický odkaz '{0}'." #: src/VolumeScanner/FilesystemVolumeScanner.cs:204 #: src/VolumeScanner/FilesystemVolumeScanner.cs:347 #, csharp-format msgid "" "Skipped symlink item '{0}' as it appears to point to a different drive " "('{1}')." msgstr "" "Preskakujem symbolický odkaz '{0}', ktorý odkazuje na inú jednotku ('{1}')." #: src/VolumeScanner/FilesystemVolumeScanner.cs:245 #, csharp-format msgid "File '{0}' not found. (Wrong filename encoding?)" msgstr "Nenašiel sa súbor '{0}'. (Možno zlé kódovanie názvu súboru?)" #: src/VolumeScanner/FilesystemVolumeScanner.cs:279 #, csharp-format msgid "Extracting metadata from file '{0}' failed. ({1})" msgstr "Extrahovanie metadát zo súboru '{0}' zlyhalo. ({1})" #: src/VolumeScanner/FilesystemVolumeScanner.cs:310 #, csharp-format msgid "Error opening file '{0}', can't retrieve any mime/metadata. ({1})" msgstr "" "Problém pri otváraní súboru '{0}': nie je možné získať žiadne metadáta. ({1})" #: src/VolumeScanner/FilesystemVolumeScanner.cs:354 #, csharp-format msgid "" "Skipped symlink item '{0}' as it does not point to a regular file ('{1}')." msgstr "" "Preskakujem symbolický odkaz '{0}', pretože neodkazuje na štandardný súbor " "('{1}')." #: src/VolumeScanner/FilesystemVolumeScanner.cs:363 #, csharp-format msgid "Skipped item '{0}' as it appears to be some kind of special file." msgstr "Preskakujem položku '{0}', pretože je to špeciálny súbor." #: src/VolumeScanner/FilesystemVolumeScanner.cs:381 #, csharp-format msgid "Unable to dump dir '{0}'. ({1})" msgstr "Nie je možné otvoriť adresár '{0}'. ({1})" #: src/VolumeScanner/FilesystemVolumeScanner.cs:500 #, csharp-format msgid "Can't read LastWriteTime from item '{0}' ({1})." msgstr "Nie je možné prečítať čas posledného zápisu pre položku '{0}' ({1})." #: src/VolumeScanner/FilesystemVolumeScanner.cs:664 #, csharp-format msgid "Failed to resolve target item for symlink '{0}'." msgstr "Problém sa nájsť cieľ symbolického odkazu '{0}'." VolumeDB/po/ru.resources0000664000175000017500000001355012067326706015426 0ustar patrickpatricklSystem.Resources.ResourceReader, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089#System.Resources.RuntimeResourceSetPADPADP8֞xϴϼƾ_@,ZLxR(I|1 4IY;CKeNNDNcPÇBTUWDXhgCh\qkdqT93 * $q ~hB y ^Can't read LastWriteTime from item '{0}' ({1}).jDirectory '{0}' not found. (Wrong filename encoding?)NError connecting to MusicBrainz server.]Error opening file '{0}', can't retrieve any mime/metadata. ({1})bExtracting metadata from file '{0}' failed. ({1})!`Failed to resolve target item for symlink '{0}'.w`File '{0}' not found. (Wrong filename encoding?)lHashcode generation not implemented for audio cds yet.JInvalid compare operator for a keyword that maps to textual contentTInvalid compare operator for keyword '{0}'OnKeyword '{0}' only supports the equality operator ('=')`No MusicBrainz metadata available for this disc.Operand for keyword '{0}' must be a number with an optional multipliercTOperand for keyword '{0}' must be a stringxParsing error: search statement is malformed at position {0}WSkipped item '{0}' as it appears to be some kind of special file.zSkipped item '{0}' as it doesn't seem to be a real directory.0Skipped symlink item '{0}' as it appears to point to a different drive ('{1}').Skipped symlink item '{0}' as it does not point to a regular file ('{1}').! pSkipped symlink item '{0}' as the target does not exist. The trackcount retrieved from MusicBrainz does not match the trackcount of the local disc. Skipped. >Unable to dump dir '{0}'. ({1}) *Unknown keyword '{0}' $Unknown type '{0}'- Project-Id-Version: basenji Report-Msgid-Bugs-To: FULL NAME POT-Creation-Date: 2012-07-15 15:49+0200 PO-Revision-Date: 2012-10-29 23:52+0000 Last-Translator: oleh Language-Team: Russian MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Launchpad-Export-Date: 2012-11-18 12:32+0000 X-Generator: Launchpad (build 16278) TНевозможно прочитать LastWriteTime из пункта '{0} "({1}).lКаталог '{0} "не найден. (Неправильная кодировка имени файла?)BОшибка соединения с сервером MusicBrainz.~Ошибка при открытии файла '{0}', не возможно получить MIME/метаданные. ({1})TИзвлечь метаданные из файла '{0}' не удалось. ({1})iНе разрешено создавать символьную ссылку '{0}' для объекта.fФайл '{0} "не найден. (Неправильная кодировка имени файла?)hГенерирование хеш-кода пока не включено для аудиодисков.Неправильный оператор сравнения для команды, сопоставляющей текстовое содержимоеXНеправильный оператор сравнения для команды '{0}'qКлючевое слово "{0} 'поддерживает только оператор равенства ('=')EНет метаданных MusicBrainz для этого диска.Операнд для ключевого слова '{0}' должно быть числом с дополнительным множителем^Операнд для ключевого слова '{0}' должен быть строкойyСинтаксическая ошибка: неправильный поисковый запрос в позиции {0}\Пропущенн пункт '{0} ", кажется это специальный файл.vЭлемент '{0}' пропущен, так как скорее всего не является каталогом.wПропущенные ссылка '{0}', кажется она указывает на другой диск ('{1}').rПропущенные ссылка '{0} ", она не указывает на обычный файл (' {1} ').[Пропущенные ссылка '{0}', цели ссылки не существует.Список треков, полученный с MusicBrainz, не совпадает со списком треков на локальном диске. Пропущено.LНе удаётся записать в дамп каталог '{0}'. ({1})8Неизвестное ключевое слово '{0}'#Неизвестный тип '{0}'VolumeDB/po/sk.resources0000664000175000017500000001201612067326706015411 0ustar patrickpatricklSystem.Resources.ResourceReader, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089#System.Resources.RuntimeResourceSetPADPADP8֞xϴϼƾ_@,ZLxR(I|1 4IY;CKeNNDNcPÇBTUWDXhgCh\qkdqT93 * $q ~hB y ^Can't read LastWriteTime from item '{0}' ({1}).jDirectory '{0}' not found. (Wrong filename encoding?)NError connecting to MusicBrainz server.EError opening file '{0}', can't retrieve any mime/metadata. ({1})zbExtracting metadata from file '{0}' failed. ({1})`Failed to resolve target item for symlink '{0}'. `File '{0}' not found. (Wrong filename encoding?)AlHashcode generation not implemented for audio cds yet.Invalid compare operator for a keyword that maps to textual contentTInvalid compare operator for keyword '{0}'9nKeyword '{0}' only supports the equality operator ('=')x`No MusicBrainz metadata available for this disc.Operand for keyword '{0}' must be a number with an optional multiplierTOperand for keyword '{0}' must be a stringIxParsing error: search statement is malformed at position {0}Skipped item '{0}' as it appears to be some kind of special file.zSkipped item '{0}' as it doesn't seem to be a real directory. Skipped symlink item '{0}' as it appears to point to a different drive ('{1}').OSkipped symlink item '{0}' as it does not point to a regular file ('{1}').pSkipped symlink item '{0}' as the target does not exist.The trackcount retrieved from MusicBrainz does not match the trackcount of the local disc. Skipped.)>Unable to dump dir '{0}'. ({1})*Unknown keyword '{0}'$Unknown type '{0}'Project-Id-Version: basenji Report-Msgid-Bugs-To: FULL NAME POT-Creation-Date: 2012-07-15 15:49+0200 PO-Revision-Date: 2012-07-21 22:44+0000 Last-Translator: Izidor Matušov Language-Team: Slovak MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Launchpad-Export-Date: 2012-10-27 11:00+0000 X-Generator: Launchpad (build 16194) MNie je možné prečítať čas posledného zápisu pre položku '{0}' ({1}).HAdresár '{0}' nebol nájdený. (Možno zlé kódovanie názvu súboru?)3Nastala chyba pri pripájaní k serveru MusicBrainzWProblém pri otváraní súboru '{0}': nie je možné získať žiadne metadáta. ({1})5Extrahovanie metadát zo súboru '{0}' zlyhalo. ({1})5Problém sa nájsť cieľ symbolického odkazu '{0}'.CNenašiel sa súbor '{0}'. (Možno zlé kódovanie názvu súboru?)EGeneorvanie hash kódov pre zvukové CD nie je ešte implementované.jNie je možné použiť operátor porovnávania pre kľúčové slovo, ktoré sa viaže na textový obsah.=Neplatný operátor porovnávania pre kľúčové slovo '{0}'=Kľúčové slovo '{0}'podporuje iba operátor rovnosti ('=')@Pre tento disk nie sú dostupné žiadne metadáta z MusicBrainzNOperand pre kľúčové slovo '{0}' musí byť číslo s prípadným násobkom8Operand pre kľúčové slovo '{0}' musí byť reťazec.EChyba spracovania: príkaz vyhľadávania je chybný na pozícií {0}>Preskakujem položku '{0}', pretože je to špeciálny súbor.CPreskakujem položku '{0}', pretože nie je skutočným adresárom.NPreskakujem symbolický odkaz '{0}', ktorý odkazuje na inú jednotku ('{1}').XPreskakujem symbolický odkaz '{0}', pretože neodkazuje na štandardný súbor ('{1}')..Preskakujem neplatný symbolický odkaz '{0}'.hPočet skladieb získaný z MusicBrainz sa nezhoduje s počtom skladieb na lokálnom disky. Preskakujem.-Nie je možné otvoriť adresár '{0}'. ({1}) Neznáme kľúčové slovo '{0}'Neznámy typ '{0}'VolumeDB/po/cs.po0000664000175000017500000001362212067326706014011 0ustar patrickpatrick# Czech translation for basenji # Copyright (c) 2011 Rosetta Contributors and Canonical Ltd 2011 # This file is distributed under the same license as the basenji package. # FIRST AUTHOR , 2011. # msgid "" msgstr "" "Project-Id-Version: basenji\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2012-07-15 15:49+0200\n" "PO-Revision-Date: 2011-09-18 16:02+0000\n" "Last-Translator: Konki \n" "Language-Team: Czech \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2012-10-27 11:00+0000\n" "X-Generator: Launchpad (build 16194)\n" #: src/Searching/VolumeSearchCriteria/EUSLSearchCriteria.cs:74 #: src/Searching/ItemSearchCriteria/EUSLSearchCriteria.cs:65 #, csharp-format msgid "" "Operand for keyword '{0}' must be a number with an optional multiplier" msgstr "Operand pro klíčové slovo '{0}' musí být číslo s volitelným násobkem" #: src/Searching/VolumeSearchCriteria/EUSLSearchCriteria.cs:84 #: src/Searching/ItemSearchCriteria/EUSLSearchCriteria.cs:75 #, csharp-format msgid "Invalid compare operator for keyword '{0}'" msgstr "Neplatný srovnávací operátor pro klíčové slovo '{0}'" #: src/Searching/VolumeSearchCriteria/EUSLSearchCriteria.cs:99 #: src/Searching/ItemSearchCriteria/EUSLSearchCriteria.cs:122 #, csharp-format msgid "Unknown keyword '{0}'" msgstr "Neznámé klíčové slovo '{0}'" #: src/Searching/VolumeSearchCriteria/EUSLSearchCriteria.cs:109 #: src/Searching/ItemSearchCriteria/EUSLSearchCriteria.cs:133 msgid "Invalid compare operator for a keyword that maps to textual content" msgstr "" "Neplatný srovnávací operátor pro klíčové slovo, které mapuje na textový obsah" #: src/Searching/ItemSearchCriteria/EUSLSearchCriteria.cs:85 #, csharp-format msgid "Operand for keyword '{0}' must be a string" msgstr "Operand pro klíčové slovo '{0}' musí být řetězec" #: src/Searching/ItemSearchCriteria/EUSLSearchCriteria.cs:94 #, csharp-format msgid "Unknown type '{0}'" msgstr "Neznámý typ '{0}'" #: src/Searching/ItemSearchCriteria/EUSLSearchCriteria.cs:100 #, csharp-format msgid "Keyword '{0}' only supports the equality operator ('=')" msgstr "Klíčové slovo '{0}' podporuje jen rovnající se operátor ('=')" #: src/Searching/AbstractEUSLSearchCriteria.cs:87 #: src/Searching/AbstractEUSLSearchCriteria.cs:91 #, csharp-format msgid "Parsing error: search statement is malformed at position {0}" msgstr "Zpracovávám chybu: hledaný úkaz je chybný na pozici {0}" #: src/VolumeScanner/AudioCdVolumeScanner.cs:55 msgid "Hashcode generation not implemented for audio cds yet." msgstr "Generace hash kódu není ještě implementována pro audio cd." #: src/VolumeScanner/AudioCdVolumeScanner.cs:97 msgid "No MusicBrainz metadata available for this disc." msgstr "Pro tento disk nejsou dostupná MusicBrainz metadata." #: src/VolumeScanner/AudioCdVolumeScanner.cs:102 msgid "" "The trackcount retrieved from MusicBrainz does not match the trackcount of " "the local disc. Skipped." msgstr "" "Počítadlo stop načtené z MusicBrainz nesouhlasí s počítadlem na lokálním " "disku. Zrušeno." #: src/VolumeScanner/AudioCdVolumeScanner.cs:125 msgid "Error connecting to MusicBrainz server." msgstr "Chyba při připojování k serveru MusicBrainz." #: src/VolumeScanner/FilesystemVolumeScanner.cs:165 #, csharp-format msgid "Directory '{0}' not found. (Wrong filename encoding?)" msgstr "Adresář '{0}' nenalezen. (Špatné kódování názvu souboru?)" #: src/VolumeScanner/FilesystemVolumeScanner.cs:174 #, csharp-format msgid "Skipped item '{0}' as it doesn't seem to be a real directory." msgstr "" "Zrušená položka '{0}' jako je tato, se nezdá být skutečným adresářem." #: src/VolumeScanner/FilesystemVolumeScanner.cs:195 #: src/VolumeScanner/FilesystemVolumeScanner.cs:340 #, csharp-format msgid "Skipped symlink item '{0}' as the target does not exist." msgstr "Zrušená položka symlinku '{0}' jako je cílová, neexistuje." #: src/VolumeScanner/FilesystemVolumeScanner.cs:204 #: src/VolumeScanner/FilesystemVolumeScanner.cs:347 #, csharp-format msgid "" "Skipped symlink item '{0}' as it appears to point to a different drive " "('{1}')." msgstr "" "Zrušená položka symlinku '{0}' jako tato se objeví na jiné jednotce ('{1}')." #: src/VolumeScanner/FilesystemVolumeScanner.cs:245 #, csharp-format msgid "File '{0}' not found. (Wrong filename encoding?)" msgstr "Soubor '{0}' nebyl nalezen. (Špatné kódování názvu souboru?)" #: src/VolumeScanner/FilesystemVolumeScanner.cs:279 #, csharp-format msgid "Extracting metadata from file '{0}' failed. ({1})" msgstr "Extrakce metadat ze souboru '{0}' selhala. ({1})" #: src/VolumeScanner/FilesystemVolumeScanner.cs:310 #, csharp-format msgid "Error opening file '{0}', can't retrieve any mime/metadata. ({1})" msgstr "" "Chyba při otvírání souboru '{0}', nelze získat žádná mime/metadata. ({1})" #: src/VolumeScanner/FilesystemVolumeScanner.cs:354 #, csharp-format msgid "" "Skipped symlink item '{0}' as it does not point to a regular file ('{1}')." msgstr "" "Zrušená položka symlinku '{0}' jako tato neukazuje na běžný soubor ('{1}')." #: src/VolumeScanner/FilesystemVolumeScanner.cs:363 #, csharp-format msgid "Skipped item '{0}' as it appears to be some kind of special file." msgstr "" "Zrušená položka '{0}' , jak to tak vypadá, je nějaký speciální soubor." #: src/VolumeScanner/FilesystemVolumeScanner.cs:381 #, csharp-format msgid "Unable to dump dir '{0}'. ({1})" msgstr "Nelze odstranit adresář '{0}'. ({1})" #: src/VolumeScanner/FilesystemVolumeScanner.cs:500 #, csharp-format msgid "Can't read LastWriteTime from item '{0}' ({1})." msgstr "Nelze číst LastWriteTime z položky '{0}' ({1})." #: src/VolumeScanner/FilesystemVolumeScanner.cs:664 #, csharp-format msgid "Failed to resolve target item for symlink '{0}'." msgstr "Nepodařilo se vyřešit cílovou položku pro symlink '{0}'." VolumeDB/po/oc.resources0000664000175000017500000000340012067326706015372 0ustar patrickpatricklSystem.Resources.ResourceReader, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089#System.Resources.RuntimeResourceSet PADPADPZLI|1IY;CKÇBTDXhg\q*fh7^Can't read LastWriteTime from item '{0}' ({1}).jDirectory '{0}' not found. (Wrong filename encoding?)NError connecting to MusicBrainz server.U`Failed to resolve target item for symlink '{0}'.`File '{0}' not found. (Wrong filename encoding?)>Unable to dump dir '{0}'. ({1})*Unknown keyword '{0}'C$Unknown type '{0}'^Project-Id-Version: basenji Report-Msgid-Bugs-To: FULL NAME POT-Creation-Date: 2012-07-15 15:49+0200 PO-Revision-Date: 2010-05-22 09:50+0000 Last-Translator: Cédric VALMARY (Tot en òc) Language-Team: Occitan (post 1500) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Launchpad-Export-Date: 2012-10-27 11:00+0000 X-Generator: Launchpad (build 16194) WImpossible de legir l'ora del darrièr enregistrament per aqueste objècte '{0}' ({1}).;Dorsièr '{0}' pas trobat. (Marrit encodatge de fichièr ?):Error al moment de la connexion al servidor MusicBrainz...AImpossible de resòlvre l'objècte cibla de ligam simbolic '{0}'., 2012. msgid "" msgstr "" "Project-Id-Version: basenji\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2012-07-15 15:49+0200\n" "PO-Revision-Date: 2012-10-30 14:24+0000\n" "Last-Translator: Мирослав Николић \n" "Language-Team: Serbian translators\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2012-11-18 12:32+0000\n" "X-Generator: Launchpad (build 16278)\n" "Language: sr\n" #: src/Searching/VolumeSearchCriteria/EUSLSearchCriteria.cs:74 #: src/Searching/ItemSearchCriteria/EUSLSearchCriteria.cs:65 #, csharp-format msgid "" "Operand for keyword '{0}' must be a number with an optional multiplier" msgstr "Операнд кључне речи „{0}“ мора бити број, са опционалним множитељем" #: src/Searching/VolumeSearchCriteria/EUSLSearchCriteria.cs:84 #: src/Searching/ItemSearchCriteria/EUSLSearchCriteria.cs:75 #, csharp-format msgid "Invalid compare operator for keyword '{0}'" msgstr "Неправилан оператор поређења за кључну реч „{0}“" #: src/Searching/VolumeSearchCriteria/EUSLSearchCriteria.cs:99 #: src/Searching/ItemSearchCriteria/EUSLSearchCriteria.cs:122 #, csharp-format msgid "Unknown keyword '{0}'" msgstr "Непозната кључна реч „{0}“" #: src/Searching/VolumeSearchCriteria/EUSLSearchCriteria.cs:109 #: src/Searching/ItemSearchCriteria/EUSLSearchCriteria.cs:133 msgid "Invalid compare operator for a keyword that maps to textual content" msgstr "" "Неправилан оператор поређења за кључну реч која се односи на текстуални " "садржај" #: src/Searching/ItemSearchCriteria/EUSLSearchCriteria.cs:85 #, csharp-format msgid "Operand for keyword '{0}' must be a string" msgstr "Операнд кључне речи „{0}“ мора бити низ" #: src/Searching/ItemSearchCriteria/EUSLSearchCriteria.cs:94 #, csharp-format msgid "Unknown type '{0}'" msgstr "Непозната врста „{0}“" #: src/Searching/ItemSearchCriteria/EUSLSearchCriteria.cs:100 #, csharp-format msgid "Keyword '{0}' only supports the equality operator ('=')" msgstr "Кључна реч „{0}“ подржава само једнакост („=“) као оператор" #: src/Searching/AbstractEUSLSearchCriteria.cs:87 #: src/Searching/AbstractEUSLSearchCriteria.cs:91 #, csharp-format msgid "Parsing error: search statement is malformed at position {0}" msgstr "" "Грешка рашчлањивања: захтев за претрагу је неправилан на положају {0}" #: src/VolumeScanner/AudioCdVolumeScanner.cs:55 msgid "Hashcode generation not implemented for audio cds yet." msgstr "Рачунање хеш резултата још увек није омогућено за аудио дискове." #: src/VolumeScanner/AudioCdVolumeScanner.cs:97 msgid "No MusicBrainz metadata available for this disc." msgstr "Музички мозгић нема доступне метаподатке за овај диск." #: src/VolumeScanner/AudioCdVolumeScanner.cs:102 msgid "" "The trackcount retrieved from MusicBrainz does not match the trackcount of " "the local disc. Skipped." msgstr "" "Број нумера добављен са Музичког мозгића се не подудара са бројем нумера на " "диску. Прескочено." #: src/VolumeScanner/AudioCdVolumeScanner.cs:125 msgid "Error connecting to MusicBrainz server." msgstr "Грешка при повезивању са сервером Музичког мозгића." #: src/VolumeScanner/FilesystemVolumeScanner.cs:165 #, csharp-format msgid "Directory '{0}' not found. (Wrong filename encoding?)" msgstr "Није пронађена фасцикла „{0}“. (Погрешно кодиран назив датотеке?)" #: src/VolumeScanner/FilesystemVolumeScanner.cs:174 #, csharp-format msgid "Skipped item '{0}' as it doesn't seem to be a real directory." msgstr "Ставка „{0}“ је прескочена пошто вероватно није стварна фасцикла." #: src/VolumeScanner/FilesystemVolumeScanner.cs:195 #: src/VolumeScanner/FilesystemVolumeScanner.cs:340 #, csharp-format msgid "Skipped symlink item '{0}' as the target does not exist." msgstr "Симболичка веза „{0}“ је прескочена пошто одредиште не постоји." #: src/VolumeScanner/FilesystemVolumeScanner.cs:204 #: src/VolumeScanner/FilesystemVolumeScanner.cs:347 #, csharp-format msgid "" "Skipped symlink item '{0}' as it appears to point to a different drive " "('{1}')." msgstr "" "Симболичка веза „{0}“ је прескочена пошто указује на други уређај („{1}“)." #: src/VolumeScanner/FilesystemVolumeScanner.cs:245 #, csharp-format msgid "File '{0}' not found. (Wrong filename encoding?)" msgstr "Није пронађена датотека „{0}“ . (Погрешно кодиран назив датотеке?)" #: src/VolumeScanner/FilesystemVolumeScanner.cs:279 #, csharp-format msgid "Extracting metadata from file '{0}' failed. ({1})" msgstr "Извлачење метаподатка из датотеке „{0}“ није успело. ({1})" #: src/VolumeScanner/FilesystemVolumeScanner.cs:310 #, csharp-format msgid "Error opening file '{0}', can't retrieve any mime/metadata. ({1})" msgstr "" "Грешка отварања датотеке „{0}“, не могу да прибавим метаподатке. ({1})" #: src/VolumeScanner/FilesystemVolumeScanner.cs:354 #, csharp-format msgid "" "Skipped symlink item '{0}' as it does not point to a regular file ('{1}')." msgstr "" "Симболичка веза „{0}“ је прескочена пошто не указује на исправну датотеку " "(„{1}“)." #: src/VolumeScanner/FilesystemVolumeScanner.cs:363 #, csharp-format msgid "Skipped item '{0}' as it appears to be some kind of special file." msgstr "" "Ставка „{0}“ је прескочена пошто изгледа као нека врста посебне датотеке." #: src/VolumeScanner/FilesystemVolumeScanner.cs:381 #, csharp-format msgid "Unable to dump dir '{0}'. ({1})" msgstr "Не могу да сажмем фасциклу „{0}“. ({1})" #: src/VolumeScanner/FilesystemVolumeScanner.cs:500 #, csharp-format msgid "Can't read LastWriteTime from item '{0}' ({1})." msgstr "Не могу да очитам време последњег уписа за ставку „{0}“ ({1})." #: src/VolumeScanner/FilesystemVolumeScanner.cs:664 #, csharp-format msgid "Failed to resolve target item for symlink '{0}'." msgstr "Нисам успео да решим одредишну ставку за симболичку везу „{0}“." VolumeDB/po/fr.resources0000664000175000017500000001203512067326706015404 0ustar patrickpatricklSystem.Resources.ResourceReader, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089#System.Resources.RuntimeResourceSetPADPADP8֞xϴϼƾ_@,ZLxR(I|1 4IY;CKeNNDNcPÇBTUWDXhgCh\qkdqT93 * $q ~hB y ^Can't read LastWriteTime from item '{0}' ({1}).jDirectory '{0}' not found. (Wrong filename encoding?)NError connecting to MusicBrainz server.+Error opening file '{0}', can't retrieve any mime/metadata. ({1})bbExtracting metadata from file '{0}' failed. ({1})`Failed to resolve target item for symlink '{0}'.`File '{0}' not found. (Wrong filename encoding?)GlHashcode generation not implemented for audio cds yet.Invalid compare operator for a keyword that maps to textual contentTInvalid compare operator for keyword '{0}'3nKeyword '{0}' only supports the equality operator ('=')n`No MusicBrainz metadata available for this disc.Operand for keyword '{0}' must be a number with an optional multiplierTOperand for keyword '{0}' must be a stringGxParsing error: search statement is malformed at position {0}sSkipped item '{0}' as it appears to be some kind of special file.zSkipped item '{0}' as it doesn't seem to be a real directory. Skipped symlink item '{0}' as it appears to point to a different drive ('{1}').LSkipped symlink item '{0}' as it does not point to a regular file ('{1}').pSkipped symlink item '{0}' as the target does not exist.The trackcount retrieved from MusicBrainz does not match the trackcount of the local disc. Skipped..>Unable to dump dir '{0}'. ({1})*Unknown keyword '{0}'$Unknown type '{0}'Project-Id-Version: basenji Report-Msgid-Bugs-To: FULL NAME POT-Creation-Date: 2012-07-15 15:49+0200 PO-Revision-Date: 2011-11-13 06:47+0000 Last-Translator: Aurélien RIVIERE Language-Team: French MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Launchpad-Export-Date: 2012-10-27 11:00+0000 X-Generator: Launchpad (build 16194) PImpossible de lire l'heure de dernier enregistrement pour cet objet '{0}' ({1}).:Dossier '{0}' non trouvé. (Mauvais encodage de fichier ?)5Erreur lors de la connexion au serveur MusicBrainz...XErreur d'ouverture du fichier '{0}', impossible de récupérer les méta-données. ({1})HL'extraction des métadonnées depuis le fichier '{0}' a échoué. ({1})?Impossible de résoudre l'objet cible de lien symbolique '{0}'.:Fichier '{0}' non trouvé. (Mauvais encodage de fichier ?)WGénération de la somme de contrôle n'est pas encore implémentée pour les CD audio.UOpérateur de comparaison invalide pour un mot clé qui correspond à contenu textuel9Opérateur de comparaison invalide pour le mot clé "{0}"7Keyword '{0}' only supports the equality operator ('='):Aucune métadonnée MusicBrainz disponible pour ce disque.bOpérande pour le mot clé "{0} 'doit être un nombre avec un coefficient multiplicateur en option*Operand for keyword '{0}' must be a stringMErreur de syntaxe : Déclaration de recherche mal formulé à la position {0}FObjet ignoré '{0}' car il semble être une sorte de fichier spécial.@Objet ignoré '{0}' car il ne semble pas être un dossier réel.Nlien symbolique ignoré '{0}' car il pointe sur un lecteur différent ('{1}').TLien symbolique ignoré '{0}' car il ne pointe pas vers un fichier standard ('{1}').:lien symbolique ignoré '{0}' la destination n'existe pas.zLes pistes retrouvées sur le serveur MusicBrainz ne correspondent pas aux pistes présentes sur le disque local. Annulé./Impossible de supprimer le dossier '{0}'. ({1})Clé inconnu '{0}'Type inconnu de '{0} "VolumeDB/po/et.po0000664000175000017500000001315712067326706014017 0ustar patrickpatrick# Estonian translation for basenji # Copyright (c) 2010 Rosetta Contributors and Canonical Ltd 2010 # This file is distributed under the same license as the basenji package. # FIRST AUTHOR , 2010. # msgid "" msgstr "" "Project-Id-Version: basenji\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2012-07-15 15:49+0200\n" "PO-Revision-Date: 2010-10-09 21:43+0000\n" "Last-Translator: olavi tohver \n" "Language-Team: Estonian \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2012-10-27 11:00+0000\n" "X-Generator: Launchpad (build 16194)\n" #: src/Searching/VolumeSearchCriteria/EUSLSearchCriteria.cs:74 #: src/Searching/ItemSearchCriteria/EUSLSearchCriteria.cs:65 #, csharp-format msgid "" "Operand for keyword '{0}' must be a number with an optional multiplier" msgstr "Operand märksõnale '{0}' peab olema number täiendava kordajaga" #: src/Searching/VolumeSearchCriteria/EUSLSearchCriteria.cs:84 #: src/Searching/ItemSearchCriteria/EUSLSearchCriteria.cs:75 #, csharp-format msgid "Invalid compare operator for keyword '{0}'" msgstr "Vale võrdlusoperaator märksõnale '{0}'" #: src/Searching/VolumeSearchCriteria/EUSLSearchCriteria.cs:99 #: src/Searching/ItemSearchCriteria/EUSLSearchCriteria.cs:122 #, csharp-format msgid "Unknown keyword '{0}'" msgstr "Tundmatu märksõna '{0}'" #: src/Searching/VolumeSearchCriteria/EUSLSearchCriteria.cs:109 #: src/Searching/ItemSearchCriteria/EUSLSearchCriteria.cs:133 msgid "Invalid compare operator for a keyword that maps to textual content" msgstr "Vale võrdlusoperaator märksõnale, mis osutab tekstilisele sisule." #: src/Searching/ItemSearchCriteria/EUSLSearchCriteria.cs:85 #, csharp-format msgid "Operand for keyword '{0}' must be a string" msgstr "Operand märksõnale '{0}' peab olema string" #: src/Searching/ItemSearchCriteria/EUSLSearchCriteria.cs:94 #, csharp-format msgid "Unknown type '{0}'" msgstr "Tundmatu tüüp '{0}'" #: src/Searching/ItemSearchCriteria/EUSLSearchCriteria.cs:100 #, csharp-format msgid "Keyword '{0}' only supports the equality operator ('=')" msgstr "Märksõna '{0}' toetab ainult võrdsusoperaatorit ('=')" #: src/Searching/AbstractEUSLSearchCriteria.cs:87 #: src/Searching/AbstractEUSLSearchCriteria.cs:91 #, csharp-format msgid "Parsing error: search statement is malformed at position {0}" msgstr "Parsimise viga: otsingusõna on vigane asukohal {0}" #: src/VolumeScanner/AudioCdVolumeScanner.cs:55 msgid "Hashcode generation not implemented for audio cds yet." msgstr "Kontrollsumma loomine audio-cd jaoks pole toetatud veel." #: src/VolumeScanner/AudioCdVolumeScanner.cs:97 msgid "No MusicBrainz metadata available for this disc." msgstr "MusicBrainz metaandmeid pole ketta jaoks saadaval." #: src/VolumeScanner/AudioCdVolumeScanner.cs:102 msgid "" "The trackcount retrieved from MusicBrainz does not match the trackcount of " "the local disc. Skipped." msgstr "" "MusicBrainz-ist hangitud loojärjestus ei kattu kohaliku ketta " "loojärjestusele. Vahelejäetud." #: src/VolumeScanner/AudioCdVolumeScanner.cs:125 msgid "Error connecting to MusicBrainz server." msgstr "Viga ühenduse loomisel MusicBrainz serverisse." #: src/VolumeScanner/FilesystemVolumeScanner.cs:165 #, csharp-format msgid "Directory '{0}' not found. (Wrong filename encoding?)" msgstr "Kausta '{0}' ei leitud. (Vale failinime kodeering?)" #: src/VolumeScanner/FilesystemVolumeScanner.cs:174 #, csharp-format msgid "Skipped item '{0}' as it doesn't seem to be a real directory." msgstr "Eirati element '{0}', sest see ei tundu olema reaalne kaust." #: src/VolumeScanner/FilesystemVolumeScanner.cs:195 #: src/VolumeScanner/FilesystemVolumeScanner.cs:340 #, csharp-format msgid "Skipped symlink item '{0}' as the target does not exist." msgstr "Eirati nimeviit '{0}', sest sihtmärki ei leitud." #: src/VolumeScanner/FilesystemVolumeScanner.cs:204 #: src/VolumeScanner/FilesystemVolumeScanner.cs:347 #, csharp-format msgid "" "Skipped symlink item '{0}' as it appears to point to a different drive " "('{1}')." msgstr "Eirati nimeviit '{0}' kuna see viitab teisele kettale ('{1}')." #: src/VolumeScanner/FilesystemVolumeScanner.cs:245 #, csharp-format msgid "File '{0}' not found. (Wrong filename encoding?)" msgstr "Faili '{0}' ei leitud. (Vale failinime kodeering?)" #: src/VolumeScanner/FilesystemVolumeScanner.cs:279 #, csharp-format msgid "Extracting metadata from file '{0}' failed. ({1})" msgstr "" #: src/VolumeScanner/FilesystemVolumeScanner.cs:310 #, csharp-format msgid "Error opening file '{0}', can't retrieve any mime/metadata. ({1})" msgstr "Viga faili '{0}' avamisel, ei suutnud hankida mime/metaandmeid.({1})" #: src/VolumeScanner/FilesystemVolumeScanner.cs:354 #, csharp-format msgid "" "Skipped symlink item '{0}' as it does not point to a regular file ('{1}')." msgstr "Eirati nimeviit '{0}', sest see ei viita tavalisele failile ('{1}')." #: src/VolumeScanner/FilesystemVolumeScanner.cs:363 #, csharp-format msgid "Skipped item '{0}' as it appears to be some kind of special file." msgstr "Eirati element '{0}' ,sest see tundub olema tähtis fail." #: src/VolumeScanner/FilesystemVolumeScanner.cs:381 #, csharp-format msgid "Unable to dump dir '{0}'. ({1})" msgstr "Võimatu luua kaustatõmmist '{0}'. ({1})" #: src/VolumeScanner/FilesystemVolumeScanner.cs:500 #, csharp-format msgid "Can't read LastWriteTime from item '{0}' ({1})." msgstr "Ei saanud lugeda viimast muutmisaega elemendist '{0}' ({1})" #: src/VolumeScanner/FilesystemVolumeScanner.cs:664 #, csharp-format msgid "Failed to resolve target item for symlink '{0}'." msgstr "Ebaõnnestus leida sihtmärk nimeviida '{0}' jaoks." VolumeDB/po/hu.resources0000664000175000017500000000307712067326706015417 0ustar patrickpatricklSystem.Resources.ResourceReader, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089#System.Resources.RuntimeResourceSetPADPADPxR(CKÇBTUWDXhg\q,t1NjDirectory '{0}' not found. (Wrong filename encoding?)NError connecting to MusicBrainz server.`File '{0}' not found. (Wrong filename encoding?)lHashcode generation not implemented for audio cds yet.Q`No MusicBrainz metadata available for this disc.*Unknown keyword '{0}'$Unknown type '{0}'Project-Id-Version: basenji Report-Msgid-Bugs-To: FULL NAME POT-Creation-Date: 2012-07-15 15:49+0200 PO-Revision-Date: 2010-08-16 05:56+0000 Last-Translator: Polesz Language-Team: Hungarian MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Launchpad-Export-Date: 2012-10-27 11:00+0000 X-Generator: Launchpad (build 16194) , YEAR. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2012-07-15 15:49+0200\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" #: src/Searching/VolumeSearchCriteria/EUSLSearchCriteria.cs:74 #: src/Searching/ItemSearchCriteria/EUSLSearchCriteria.cs:65 #, csharp-format msgid "Operand for keyword '{0}' must be a number with an optional multiplier" msgstr "" #: src/Searching/VolumeSearchCriteria/EUSLSearchCriteria.cs:84 #: src/Searching/ItemSearchCriteria/EUSLSearchCriteria.cs:75 #, csharp-format msgid "Invalid compare operator for keyword '{0}'" msgstr "" #: src/Searching/VolumeSearchCriteria/EUSLSearchCriteria.cs:99 #: src/Searching/ItemSearchCriteria/EUSLSearchCriteria.cs:122 #, csharp-format msgid "Unknown keyword '{0}'" msgstr "" #: src/Searching/VolumeSearchCriteria/EUSLSearchCriteria.cs:109 #: src/Searching/ItemSearchCriteria/EUSLSearchCriteria.cs:133 msgid "Invalid compare operator for a keyword that maps to textual content" msgstr "" #: src/Searching/ItemSearchCriteria/EUSLSearchCriteria.cs:85 #, csharp-format msgid "Operand for keyword '{0}' must be a string" msgstr "" #: src/Searching/ItemSearchCriteria/EUSLSearchCriteria.cs:94 #, csharp-format msgid "Unknown type '{0}'" msgstr "" #: src/Searching/ItemSearchCriteria/EUSLSearchCriteria.cs:100 #, csharp-format msgid "Keyword '{0}' only supports the equality operator ('=')" msgstr "" #: src/Searching/AbstractEUSLSearchCriteria.cs:87 #: src/Searching/AbstractEUSLSearchCriteria.cs:91 #, csharp-format msgid "Parsing error: search statement is malformed at position {0}" msgstr "" #: src/VolumeScanner/AudioCdVolumeScanner.cs:55 msgid "Hashcode generation not implemented for audio cds yet." msgstr "" #: src/VolumeScanner/AudioCdVolumeScanner.cs:97 msgid "No MusicBrainz metadata available for this disc." msgstr "" #: src/VolumeScanner/AudioCdVolumeScanner.cs:102 msgid "" "The trackcount retrieved from MusicBrainz does not match the trackcount of " "the local disc. Skipped." msgstr "" #: src/VolumeScanner/AudioCdVolumeScanner.cs:125 msgid "Error connecting to MusicBrainz server." msgstr "" #: src/VolumeScanner/FilesystemVolumeScanner.cs:165 #, csharp-format msgid "Directory '{0}' not found. (Wrong filename encoding?)" msgstr "" #: src/VolumeScanner/FilesystemVolumeScanner.cs:174 #, csharp-format msgid "Skipped item '{0}' as it doesn't seem to be a real directory." msgstr "" #: src/VolumeScanner/FilesystemVolumeScanner.cs:195 #: src/VolumeScanner/FilesystemVolumeScanner.cs:340 #, csharp-format msgid "Skipped symlink item '{0}' as the target does not exist." msgstr "" #: src/VolumeScanner/FilesystemVolumeScanner.cs:204 #: src/VolumeScanner/FilesystemVolumeScanner.cs:347 #, csharp-format msgid "" "Skipped symlink item '{0}' as it appears to point to a different drive " "('{1}')." msgstr "" #: src/VolumeScanner/FilesystemVolumeScanner.cs:245 #, csharp-format msgid "File '{0}' not found. (Wrong filename encoding?)" msgstr "" #: src/VolumeScanner/FilesystemVolumeScanner.cs:279 #, csharp-format msgid "Extracting metadata from file '{0}' failed. ({1})" msgstr "" #: src/VolumeScanner/FilesystemVolumeScanner.cs:310 #, csharp-format msgid "Error opening file '{0}', can't retrieve any mime/metadata. ({1})" msgstr "" #: src/VolumeScanner/FilesystemVolumeScanner.cs:354 #, csharp-format msgid "" "Skipped symlink item '{0}' as it does not point to a regular file ('{1}')." msgstr "" #: src/VolumeScanner/FilesystemVolumeScanner.cs:363 #, csharp-format msgid "Skipped item '{0}' as it appears to be some kind of special file." msgstr "" #: src/VolumeScanner/FilesystemVolumeScanner.cs:381 #, csharp-format msgid "Unable to dump dir '{0}'. ({1})" msgstr "" #: src/VolumeScanner/FilesystemVolumeScanner.cs:500 #, csharp-format msgid "Can't read LastWriteTime from item '{0}' ({1})." msgstr "" #: src/VolumeScanner/FilesystemVolumeScanner.cs:664 #, csharp-format msgid "Failed to resolve target item for symlink '{0}'." msgstr "" VolumeDB/po/bg.resources0000664000175000017500000000137512067326706015372 0ustar patrickpatricklSystem.Resources.ResourceReader, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089#System.Resources.RuntimeResourceSetPADPADPCKNError connecting to MusicBrainz server.Project-Id-Version: basenji Report-Msgid-Bugs-To: FULL NAME POT-Creation-Date: 2012-07-15 15:49+0200 PO-Revision-Date: 2010-04-22 13:42+0000 Last-Translator: svilborg Language-Team: Bulgarian MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Launchpad-Export-Date: 2012-10-27 11:00+0000 X-Generator: Launchpad (build 16194) HГрешка при заявка към сървъра на MusicBrainz.VolumeDB/po/it.po0000664000175000017500000001371712067326706014025 0ustar patrickpatrick# Italian translation for basenji # Copyright (c) 2009 Rosetta Contributors and Canonical Ltd 2009 # This file is distributed under the same license as the basenji package. # FIRST AUTHOR , 2009. # msgid "" msgstr "" "Project-Id-Version: basenji\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2012-07-15 15:49+0200\n" "PO-Revision-Date: 2011-11-29 00:58+0000\n" "Last-Translator: Fidel Nadera \n" "Language-Team: Italian \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2012-10-27 11:00+0000\n" "X-Generator: Launchpad (build 16194)\n" #: src/Searching/VolumeSearchCriteria/EUSLSearchCriteria.cs:74 #: src/Searching/ItemSearchCriteria/EUSLSearchCriteria.cs:65 #, csharp-format msgid "" "Operand for keyword '{0}' must be a number with an optional multiplier" msgstr "" "L'operando per la parola chiave '{0}' deve essere un numero con un " "molptiplicatore opzionale" #: src/Searching/VolumeSearchCriteria/EUSLSearchCriteria.cs:84 #: src/Searching/ItemSearchCriteria/EUSLSearchCriteria.cs:75 #, csharp-format msgid "Invalid compare operator for keyword '{0}'" msgstr "Operatore comparatore non valido per la parola chiave '{0}'" #: src/Searching/VolumeSearchCriteria/EUSLSearchCriteria.cs:99 #: src/Searching/ItemSearchCriteria/EUSLSearchCriteria.cs:122 #, csharp-format msgid "Unknown keyword '{0}'" msgstr "Parola chiave '{0}' sconosciuta" #: src/Searching/VolumeSearchCriteria/EUSLSearchCriteria.cs:109 #: src/Searching/ItemSearchCriteria/EUSLSearchCriteria.cs:133 msgid "Invalid compare operator for a keyword that maps to textual content" msgstr "" "Operatore comparatore non valido per una parola chiave che mappa un " "contenuto testuale" #: src/Searching/ItemSearchCriteria/EUSLSearchCriteria.cs:85 #, csharp-format msgid "Operand for keyword '{0}' must be a string" msgstr "L'operando per la parola chiave '{0}' deve essere una stringa" #: src/Searching/ItemSearchCriteria/EUSLSearchCriteria.cs:94 #, csharp-format msgid "Unknown type '{0}'" msgstr "Tipo '{0}' sconosciuto" #: src/Searching/ItemSearchCriteria/EUSLSearchCriteria.cs:100 #, csharp-format msgid "Keyword '{0}' only supports the equality operator ('=')" msgstr "" "La parola chiave '{0}' supporta solo l'operatore di uguaglianza ('=')" #: src/Searching/AbstractEUSLSearchCriteria.cs:87 #: src/Searching/AbstractEUSLSearchCriteria.cs:91 #, csharp-format msgid "Parsing error: search statement is malformed at position {0}" msgstr "Errore di analisi: la frase di ricerca è errata alla posizione {0}" #: src/VolumeScanner/AudioCdVolumeScanner.cs:55 msgid "Hashcode generation not implemented for audio cds yet." msgstr "Generazione di hashcode non ancora implementata per CD audio" #: src/VolumeScanner/AudioCdVolumeScanner.cs:97 msgid "No MusicBrainz metadata available for this disc." msgstr "Nessun metadato di MusicBrainz disponibile per questo disco" #: src/VolumeScanner/AudioCdVolumeScanner.cs:102 msgid "" "The trackcount retrieved from MusicBrainz does not match the trackcount of " "the local disc. Skipped." msgstr "" "Il numero di tracce ottenuto da MusicBrainz non corrisponde al numero di " "tracce del disco locale. Saltato." #: src/VolumeScanner/AudioCdVolumeScanner.cs:125 msgid "Error connecting to MusicBrainz server." msgstr "Errore durante la connessione al server MusicBrainz." #: src/VolumeScanner/FilesystemVolumeScanner.cs:165 #, csharp-format msgid "Directory '{0}' not found. (Wrong filename encoding?)" msgstr "" "Impossibile trovare la cartella '{0}'. (Codifica del nome del file errata?)" #: src/VolumeScanner/FilesystemVolumeScanner.cs:174 #, csharp-format msgid "Skipped item '{0}' as it doesn't seem to be a real directory." msgstr "Elemento '{0}' saltato in quanto non sembra una directory reale." #: src/VolumeScanner/FilesystemVolumeScanner.cs:195 #: src/VolumeScanner/FilesystemVolumeScanner.cs:340 #, csharp-format msgid "Skipped symlink item '{0}' as the target does not exist." msgstr "Link simbolico '{0}' saltato in quanto la destinazione non esiste." #: src/VolumeScanner/FilesystemVolumeScanner.cs:204 #: src/VolumeScanner/FilesystemVolumeScanner.cs:347 #, csharp-format msgid "" "Skipped symlink item '{0}' as it appears to point to a different drive " "('{1}')." msgstr "" "Link simbolico '{0}' saltato in quanto punta ad un'unità differente ('{1}')." #: src/VolumeScanner/FilesystemVolumeScanner.cs:245 #, csharp-format msgid "File '{0}' not found. (Wrong filename encoding?)" msgstr "" "Impossibile trovare il file '{0}'. (Codifica del nome del file errata?)" #: src/VolumeScanner/FilesystemVolumeScanner.cs:279 #, csharp-format msgid "Extracting metadata from file '{0}' failed. ({1})" msgstr "Estrazione di metadati da file '{0}' non riuscita. ({1})" #: src/VolumeScanner/FilesystemVolumeScanner.cs:310 #, csharp-format msgid "Error opening file '{0}', can't retrieve any mime/metadata. ({1})" msgstr "" "Errore apertura file '{0}', impossibile ottenere un mime/metadata. ({1})" #: src/VolumeScanner/FilesystemVolumeScanner.cs:354 #, csharp-format msgid "" "Skipped symlink item '{0}' as it does not point to a regular file ('{1}')." msgstr "" "Link simbolico '{0}' saltato in quanto non punta ad un file regolare ('{1}')." #: src/VolumeScanner/FilesystemVolumeScanner.cs:363 #, csharp-format msgid "Skipped item '{0}' as it appears to be some kind of special file." msgstr "Elemento '{0}' saltato in quanto sembra un tipo di file speciale." #: src/VolumeScanner/FilesystemVolumeScanner.cs:381 #, csharp-format msgid "Unable to dump dir '{0}'. ({1})" msgstr "Impossibile leggere la cartella '{0}'. ({1})" #: src/VolumeScanner/FilesystemVolumeScanner.cs:500 #, csharp-format msgid "Can't read LastWriteTime from item '{0}' ({1})." msgstr "Impossibile leggere la data di modifica dell'elemento '{0}' ({1})." #: src/VolumeScanner/FilesystemVolumeScanner.cs:664 #, csharp-format msgid "Failed to resolve target item for symlink '{0}'." msgstr "Impossibile risolvere il file puntato dal link simbolico '{0}'." VolumeDB/po/nl.resources0000664000175000017500000001127612067326706015414 0ustar patrickpatricklSystem.Resources.ResourceReader, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089#System.Resources.RuntimeResourceSetPADPADP8֞xϴϼƾ_@,ZLxR(I|1 4IY;CKeNNDNcPÇBTUWDXhg\qkdqW*y| < Eh  ^Can't read LastWriteTime from item '{0}' ({1}).jDirectory '{0}' not found. (Wrong filename encoding?)NError connecting to MusicBrainz server.Error opening file '{0}', can't retrieve any mime/metadata. ({1})C`Failed to resolve target item for symlink '{0}'.`File '{0}' not found. (Wrong filename encoding?)lHashcode generation not implemented for audio cds yet. Invalid compare operator for a keyword that maps to textual contentBTInvalid compare operator for keyword '{0}'nKeyword '{0}' only supports the equality operator ('=')`No MusicBrainz metadata available for this disc.Operand for keyword '{0}' must be a number with an optional multiplier:TOperand for keyword '{0}' must be a stringrxParsing error: search statement is malformed at position {0}Skipped item '{0}' as it appears to be some kind of special file.zSkipped item '{0}' as it doesn't seem to be a real directory.-Skipped symlink item '{0}' as it appears to point to a different drive ('{1}').bSkipped symlink item '{0}' as it does not point to a regular file ('{1}').pSkipped symlink item '{0}' as the target does not exist.The trackcount retrieved from MusicBrainz does not match the trackcount of the local disc. Skipped.O>Unable to dump dir '{0}'. ({1})*Unknown keyword '{0}'$Unknown type '{0}'Project-Id-Version: basenji Report-Msgid-Bugs-To: FULL NAME POT-Creation-Date: 2012-07-15 15:49+0200 PO-Revision-Date: 2011-04-05 03:31+0000 Last-Translator: Bjorn Robijns Language-Team: Dutch MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Launchpad-Export-Date: 2012-10-27 11:00+0000 X-Generator: Launchpad (build 16194) 3Kan LastWriteTime niet lezen voor item '{0}' ({1}).8Map '{0}' niet gevonden. (Foute bestandsnaam gecodeerd?)1Fout bij het verbinden met de MusicBrainz-server.XFout bij het openen van bestand '{0}', er kan geen mime/metadata opgehaald worden. ({1})0Mislukt om symlink item '{0}' doel te verhelpen.Trefwoord '{0}' ondersteunt enkel de gelijkheidsoperator ('=')7Geen MusicBrainz metadata beschikbaar voor deze schijf.6Operator voor het trefwoord '{0}' moet een nummer zijn1Operator voor het trefwoord '{0}' moet tekst zijn>Fout bij het ontleden: zoekterm staat op verkeerde positie {0}FItem '{0}' overgeslagen omdat het een speciaal bestand blijkt te zijn.3Item '{0}' overgeslaan, map blijkt niet te bestaan.SSymlink item '{0}' overgeslagen omdat deze verwijst naar een ander station ('{1}').\Symlink item '{0}' overgeslagen omdat deze niet naar een standaard bestand verwijst ('{1}').8Symlink item '{0}' overgeslagen omdat doel niet bestaat.uHet nummeraantal opgehaald van MusicBrainz stemt niet overeen met het nummeraantal op de lokale schijf. Overgeslagen. Kan map '{0}' niet dumpen. ({1})Onbekend trefwoord '{0}'Onbekend type '{0}'VolumeDB/po/da.resources0000664000175000017500000000437212067326706015366 0ustar patrickpatricklSystem.Resources.ResourceReader, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089#System.Resources.RuntimeResourceSet PADPADP8֞ƾ@,ZLI|1IY;NDNkdq\hUV^Can't read LastWriteTime from item '{0}' ({1}).Error opening file '{0}', can't retrieve any mime/metadata. ({1})`Failed to resolve target item for symlink '{0}'.Skipped item '{0}' as it appears to be some kind of special file.>zSkipped item '{0}' as it doesn't seem to be a real directory.{Skipped symlink item '{0}' as it appears to point to a different drive ('{1}').Skipped symlink item '{0}' as it does not point to a regular file ('{1}').pSkipped symlink item '{0}' as the target does not exist.N>Unable to dump dir '{0}'. ({1})Project-Id-Version: basenji Report-Msgid-Bugs-To: FULL NAME POT-Creation-Date: 2012-07-15 15:49+0200 PO-Revision-Date: 2008-11-21 23:07+0000 Last-Translator: nanker Language-Team: Danish MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Launchpad-Export-Date: 2012-10-27 11:00+0000 X-Generator: Launchpad (build 16194) 2Kan ikke læse LastWriteTime fra emne '{0}' ({1}).HFejl ved åbning af fil '{0}', kan ikke finde nogle mime/metadata. ({1}),Mislykkedes at finde emne for symlink '{0}'.;Opgav emne '{0}' da det ser ud til at være en speciel fil.7Opgav emne '{0}' da det ikke synes at være et katalog.OOpgav symlink emne '{0}' da det tilsyneladende peger på et andet drev ('{1}').GOpgav symlink emne '{0}' da det ikke peger på en regulær fil ('{1}').0Opgav symlink emne '{0}' da den ikke eksisterer."Kunne ikke slette dir '{0}'. ({1})VolumeDB/po/da.po0000664000175000017500000001162712067326706013773 0ustar patrickpatrick# Danish translation for basenji # Copyright (c) 2008 Rosetta Contributors and Canonical Ltd 2008 # This file is distributed under the same license as the basenji package. # FIRST AUTHOR , 2008. # msgid "" msgstr "" "Project-Id-Version: basenji\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2012-07-15 15:49+0200\n" "PO-Revision-Date: 2008-11-21 23:07+0000\n" "Last-Translator: nanker \n" "Language-Team: Danish \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2012-10-27 11:00+0000\n" "X-Generator: Launchpad (build 16194)\n" #: src/Searching/VolumeSearchCriteria/EUSLSearchCriteria.cs:74 #: src/Searching/ItemSearchCriteria/EUSLSearchCriteria.cs:65 #, csharp-format msgid "" "Operand for keyword '{0}' must be a number with an optional multiplier" msgstr "" #: src/Searching/VolumeSearchCriteria/EUSLSearchCriteria.cs:84 #: src/Searching/ItemSearchCriteria/EUSLSearchCriteria.cs:75 #, csharp-format msgid "Invalid compare operator for keyword '{0}'" msgstr "" #: src/Searching/VolumeSearchCriteria/EUSLSearchCriteria.cs:99 #: src/Searching/ItemSearchCriteria/EUSLSearchCriteria.cs:122 #, csharp-format msgid "Unknown keyword '{0}'" msgstr "" #: src/Searching/VolumeSearchCriteria/EUSLSearchCriteria.cs:109 #: src/Searching/ItemSearchCriteria/EUSLSearchCriteria.cs:133 msgid "Invalid compare operator for a keyword that maps to textual content" msgstr "" #: src/Searching/ItemSearchCriteria/EUSLSearchCriteria.cs:85 #, csharp-format msgid "Operand for keyword '{0}' must be a string" msgstr "" #: src/Searching/ItemSearchCriteria/EUSLSearchCriteria.cs:94 #, csharp-format msgid "Unknown type '{0}'" msgstr "" #: src/Searching/ItemSearchCriteria/EUSLSearchCriteria.cs:100 #, csharp-format msgid "Keyword '{0}' only supports the equality operator ('=')" msgstr "" #: src/Searching/AbstractEUSLSearchCriteria.cs:87 #: src/Searching/AbstractEUSLSearchCriteria.cs:91 #, csharp-format msgid "Parsing error: search statement is malformed at position {0}" msgstr "" #: src/VolumeScanner/AudioCdVolumeScanner.cs:55 msgid "Hashcode generation not implemented for audio cds yet." msgstr "" #: src/VolumeScanner/AudioCdVolumeScanner.cs:97 msgid "No MusicBrainz metadata available for this disc." msgstr "" #: src/VolumeScanner/AudioCdVolumeScanner.cs:102 msgid "" "The trackcount retrieved from MusicBrainz does not match the trackcount of " "the local disc. Skipped." msgstr "" #: src/VolumeScanner/AudioCdVolumeScanner.cs:125 msgid "Error connecting to MusicBrainz server." msgstr "" #: src/VolumeScanner/FilesystemVolumeScanner.cs:165 #, csharp-format msgid "Directory '{0}' not found. (Wrong filename encoding?)" msgstr "" #: src/VolumeScanner/FilesystemVolumeScanner.cs:174 #, csharp-format msgid "Skipped item '{0}' as it doesn't seem to be a real directory." msgstr "Opgav emne '{0}' da det ikke synes at være et katalog." #: src/VolumeScanner/FilesystemVolumeScanner.cs:195 #: src/VolumeScanner/FilesystemVolumeScanner.cs:340 #, csharp-format msgid "Skipped symlink item '{0}' as the target does not exist." msgstr "Opgav symlink emne '{0}' da den ikke eksisterer." #: src/VolumeScanner/FilesystemVolumeScanner.cs:204 #: src/VolumeScanner/FilesystemVolumeScanner.cs:347 #, csharp-format msgid "" "Skipped symlink item '{0}' as it appears to point to a different drive " "('{1}')." msgstr "" "Opgav symlink emne '{0}' da det tilsyneladende peger på et andet drev " "('{1}')." #: src/VolumeScanner/FilesystemVolumeScanner.cs:245 #, csharp-format msgid "File '{0}' not found. (Wrong filename encoding?)" msgstr "" #: src/VolumeScanner/FilesystemVolumeScanner.cs:279 #, csharp-format msgid "Extracting metadata from file '{0}' failed. ({1})" msgstr "" #: src/VolumeScanner/FilesystemVolumeScanner.cs:310 #, csharp-format msgid "Error opening file '{0}', can't retrieve any mime/metadata. ({1})" msgstr "" "Fejl ved åbning af fil '{0}', kan ikke finde nogle mime/metadata. ({1})" #: src/VolumeScanner/FilesystemVolumeScanner.cs:354 #, csharp-format msgid "" "Skipped symlink item '{0}' as it does not point to a regular file ('{1}')." msgstr "" "Opgav symlink emne '{0}' da det ikke peger på en regulær fil ('{1}')." #: src/VolumeScanner/FilesystemVolumeScanner.cs:363 #, csharp-format msgid "Skipped item '{0}' as it appears to be some kind of special file." msgstr "Opgav emne '{0}' da det ser ud til at være en speciel fil." #: src/VolumeScanner/FilesystemVolumeScanner.cs:381 #, csharp-format msgid "Unable to dump dir '{0}'. ({1})" msgstr "Kunne ikke slette dir '{0}'. ({1})" #: src/VolumeScanner/FilesystemVolumeScanner.cs:500 #, csharp-format msgid "Can't read LastWriteTime from item '{0}' ({1})." msgstr "Kan ikke læse LastWriteTime fra emne '{0}' ({1})." #: src/VolumeScanner/FilesystemVolumeScanner.cs:664 #, csharp-format msgid "Failed to resolve target item for symlink '{0}'." msgstr "Mislykkedes at finde emne for symlink '{0}'." VolumeDB/po/de.resources0000664000175000017500000001213212067326706015363 0ustar patrickpatricklSystem.Resources.ResourceReader, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089#System.Resources.RuntimeResourceSetPADPADP8֞xϴϼƾ_@,ZLxR(I|1 4IY;CKeNNDNcPÇBTUWDXhgCh\qkdqT93 * $q ~hB y ^Can't read LastWriteTime from item '{0}' ({1}).jDirectory '{0}' not found. (Wrong filename encoding?)NError connecting to MusicBrainz server.Error opening file '{0}', can't retrieve any mime/metadata. ({1})XbExtracting metadata from file '{0}' failed. ({1})`Failed to resolve target item for symlink '{0}'.`File '{0}' not found. (Wrong filename encoding?)IlHashcode generation not implemented for audio cds yet.Invalid compare operator for a keyword that maps to textual contentTInvalid compare operator for keyword '{0}',nKeyword '{0}' only supports the equality operator ('=')h`No MusicBrainz metadata available for this disc.Operand for keyword '{0}' must be a number with an optional multiplierTOperand for keyword '{0}' must be a stringLxParsing error: search statement is malformed at position {0}Skipped item '{0}' as it appears to be some kind of special file.zSkipped item '{0}' as it doesn't seem to be a real directory.(Skipped symlink item '{0}' as it appears to point to a different drive ('{1}').sSkipped symlink item '{0}' as it does not point to a regular file ('{1}').pSkipped symlink item '{0}' as the target does not exist.(The trackcount retrieved from MusicBrainz does not match the trackcount of the local disc. Skipped.q>Unable to dump dir '{0}'. ({1})*Unknown keyword '{0}' $Unknown type '{0}',Project-Id-Version: basenji Report-Msgid-Bugs-To: FULL NAME POT-Creation-Date: 2012-07-15 15:49+0200 PO-Revision-Date: 2011-08-16 21:49+0000 Last-Translator: Patrick Ulbrich Language-Team: German MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Launchpad-Export-Date: 2012-10-27 11:00+0000 X-Generator: Launchpad (build 16194) =Kann das Änderungsdatum nicht von Element '{0}' lesen ({1}).AVerzeichnis '{0}' nicht gefunden. (Falsche Dateinamen-Kodierung?)9Die Verbindung zum MusicBrainz-Server ist fehlgeschlagen.YFehler beim Öffnen der Datei '{0}', Mime/Metadaten konnten nicht ermittelt werden. ({1})?Extrahieren der Metadaten aus Datei '{0}' fehlgeschlagen. ({1})SDas Auflösen des Zielelements für den symbolischen Link '{0}' ist fehlgeschlagen.;Datei '{0}' nicht gefunden. (Falsche Dateinamen-Kodierung?)@Hashcode-Berechnung ist noch nicht für Audio-CDs implementiert.bUnzulässiger Vergleichsoperator für ein Schlüsselwort das auf textuellen Inhalt abgebildet wird:Unzulässiger Vergleichsoperator für Schlüsselwort '{0}'BDas Schlüsselwort '{0}' erlaubt nur den Gleichheitsoperator ('='):Für diese CD sind keine MusicBrainz-Metadaten verfügbar.bDer Operand für das Schlüsselwort '{0}' muss eine Nummer mit einem optionalen Multiplikator sein>Der Operand für das Schlüsselwort '{0}' muss ein String seinEParsing Fehler: Der Suchausdruck ist an der Position {0} missgebildetSSymbolischer Link '{0}' wurde ausgelassen, da er eine Spezialdatei zu sein scheint.IElement '{0}' ausgelassen, da es kein echtes Verzeichnis zu sein scheint.XSymbolischer Link '{0}' wurde ausgelassen, da er auf ein anderes Laufwerk zeigt ('{1}').YSymbolischer Link '{0}' wurde ausgelassen, da er auf keine reguläre Datei zeigt ('{1}').GSymbolischer Link '{0}' wurde ausgelassen, da das Ziel nicht existiert.^Die Trackanzahl von MusicBrainz stimmt nicht mit der Trackanzahl der CD überein. Ausgelassen.7Verzeichnis '{0}' konnte nicht durchsucht werden. ({1}) Unbekanntes Schlüsselwort '{0}'Unbekannter type '{0}'VolumeDB/po/hr.po0000664000175000017500000001335712067326706014022 0ustar patrickpatrick# Croatian translation for basenji # Copyright (c) 2011 Rosetta Contributors and Canonical Ltd 2011 # This file is distributed under the same license as the basenji package. # FIRST AUTHOR , 2011. # msgid "" msgstr "" "Project-Id-Version: basenji\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2012-07-15 15:49+0200\n" "PO-Revision-Date: 2011-03-05 11:28+0000\n" "Last-Translator: Borna Bilas \n" "Language-Team: Croatian \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2012-10-27 11:00+0000\n" "X-Generator: Launchpad (build 16194)\n" #: src/Searching/VolumeSearchCriteria/EUSLSearchCriteria.cs:74 #: src/Searching/ItemSearchCriteria/EUSLSearchCriteria.cs:65 #, csharp-format msgid "" "Operand for keyword '{0}' must be a number with an optional multiplier" msgstr "" "Operator za ključnu riječ '{0}' mora biti broj s opcionalnim množiteljem" #: src/Searching/VolumeSearchCriteria/EUSLSearchCriteria.cs:84 #: src/Searching/ItemSearchCriteria/EUSLSearchCriteria.cs:75 #, csharp-format msgid "Invalid compare operator for keyword '{0}'" msgstr "Nevažeći operator uspoređivanja za ključnu riječ '{0}'" #: src/Searching/VolumeSearchCriteria/EUSLSearchCriteria.cs:99 #: src/Searching/ItemSearchCriteria/EUSLSearchCriteria.cs:122 #, csharp-format msgid "Unknown keyword '{0}'" msgstr "Nepoznata ključna riječ '{0}'." #: src/Searching/VolumeSearchCriteria/EUSLSearchCriteria.cs:109 #: src/Searching/ItemSearchCriteria/EUSLSearchCriteria.cs:133 msgid "Invalid compare operator for a keyword that maps to textual content" msgstr "" "Nevažeći operator uspoređivanja za ključnu riječ mapiranu na tekstualni " "sadržaj." #: src/Searching/ItemSearchCriteria/EUSLSearchCriteria.cs:85 #, csharp-format msgid "Operand for keyword '{0}' must be a string" msgstr "Operator za ključnu riječ '{0}' mora biti string" #: src/Searching/ItemSearchCriteria/EUSLSearchCriteria.cs:94 #, csharp-format msgid "Unknown type '{0}'" msgstr "Nepoznata vrsta '{0}'" #: src/Searching/ItemSearchCriteria/EUSLSearchCriteria.cs:100 #, csharp-format msgid "Keyword '{0}' only supports the equality operator ('=')" msgstr "Ključna riječ '{0}' podržava samo operator jednakosti ('=')" #: src/Searching/AbstractEUSLSearchCriteria.cs:87 #: src/Searching/AbstractEUSLSearchCriteria.cs:91 #, csharp-format msgid "Parsing error: search statement is malformed at position {0}" msgstr "Graška u analizi: pojam u pretraživanju je deformiran u poziciji {0}" #: src/VolumeScanner/AudioCdVolumeScanner.cs:55 msgid "Hashcode generation not implemented for audio cds yet." msgstr "Generacija Hash kodova za audio CD-e nije još implementirana." #: src/VolumeScanner/AudioCdVolumeScanner.cs:97 msgid "No MusicBrainz metadata available for this disc." msgstr "Nema MusicBrainz metapodataka dostupnih za disk." #: src/VolumeScanner/AudioCdVolumeScanner.cs:102 msgid "" "The trackcount retrieved from MusicBrainz does not match the trackcount of " "the local disc. Skipped." msgstr "" "Broj pjesama dobiven od MusicBrainz se ne slaže s brojem pjesama na lokalnom " "disku. Preskočeno." #: src/VolumeScanner/AudioCdVolumeScanner.cs:125 msgid "Error connecting to MusicBrainz server." msgstr "Greška u spajanju na MusicBrainz server." #: src/VolumeScanner/FilesystemVolumeScanner.cs:165 #, csharp-format msgid "Directory '{0}' not found. (Wrong filename encoding?)" msgstr "Mapa '{0}' nije nađena. (Pogrešno kodiranje imena?)" #: src/VolumeScanner/FilesystemVolumeScanner.cs:174 #, csharp-format msgid "Skipped item '{0}' as it doesn't seem to be a real directory." msgstr "Preskačena stavka '{0}' jer nije prava mapa." #: src/VolumeScanner/FilesystemVolumeScanner.cs:195 #: src/VolumeScanner/FilesystemVolumeScanner.cs:340 #, csharp-format msgid "Skipped symlink item '{0}' as the target does not exist." msgstr "Preskočena simbolička veza '{0}' jer cilj nije valjan." #: src/VolumeScanner/FilesystemVolumeScanner.cs:204 #: src/VolumeScanner/FilesystemVolumeScanner.cs:347 #, csharp-format msgid "" "Skipped symlink item '{0}' as it appears to point to a different drive " "('{1}')." msgstr "" "Preskočena simbolička veza '{0}' jer pokazuje na drugi pogon ('{1}')." #: src/VolumeScanner/FilesystemVolumeScanner.cs:245 #, csharp-format msgid "File '{0}' not found. (Wrong filename encoding?)" msgstr "Datoteka '{0}' nije nađena. (Pogrešno kodiranje imena?)" #: src/VolumeScanner/FilesystemVolumeScanner.cs:279 #, csharp-format msgid "Extracting metadata from file '{0}' failed. ({1})" msgstr "" #: src/VolumeScanner/FilesystemVolumeScanner.cs:310 #, csharp-format msgid "Error opening file '{0}', can't retrieve any mime/metadata. ({1})" msgstr "Greška u otvaranju '{0}', nije moguće dohvatiti metapodatke. ({1})" #: src/VolumeScanner/FilesystemVolumeScanner.cs:354 #, csharp-format msgid "" "Skipped symlink item '{0}' as it does not point to a regular file ('{1}')." msgstr "" "Preskočena simbolička veza '{0}' jer ne pokazuje normalnu datoteku ('{1}')." #: src/VolumeScanner/FilesystemVolumeScanner.cs:363 #, csharp-format msgid "Skipped item '{0}' as it appears to be some kind of special file." msgstr "Prekočena stavka '{0}' jer je nekakva posebna datoteka." #: src/VolumeScanner/FilesystemVolumeScanner.cs:381 #, csharp-format msgid "Unable to dump dir '{0}'. ({1})" msgstr "Nije moguće odbaciti mapu '{0}'. ({1})" #: src/VolumeScanner/FilesystemVolumeScanner.cs:500 #, csharp-format msgid "Can't read LastWriteTime from item '{0}' ({1})." msgstr "Nije moguće pročitati LastWriteTime iz stavke '{0}' ({1})" #: src/VolumeScanner/FilesystemVolumeScanner.cs:664 #, csharp-format msgid "Failed to resolve target item for symlink '{0}'." msgstr "Nije moguće razriješiti ciljnu stavku za simboličku vezu '{0}'." VolumeDB/po/ru.po0000664000175000017500000001547212067326706014037 0ustar patrickpatrick# Russian translation for basenji # Copyright (c) 2011 Rosetta Contributors and Canonical Ltd 2011 # This file is distributed under the same license as the basenji package. # FIRST AUTHOR , 2011. # msgid "" msgstr "" "Project-Id-Version: basenji\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2012-07-15 15:49+0200\n" "PO-Revision-Date: 2012-10-29 23:52+0000\n" "Last-Translator: oleh \n" "Language-Team: Russian \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2012-11-18 12:32+0000\n" "X-Generator: Launchpad (build 16278)\n" #: src/Searching/VolumeSearchCriteria/EUSLSearchCriteria.cs:74 #: src/Searching/ItemSearchCriteria/EUSLSearchCriteria.cs:65 #, csharp-format msgid "" "Operand for keyword '{0}' must be a number with an optional multiplier" msgstr "" "Операнд для ключевого слова '{0}' должно быть числом с дополнительным " "множителем" #: src/Searching/VolumeSearchCriteria/EUSLSearchCriteria.cs:84 #: src/Searching/ItemSearchCriteria/EUSLSearchCriteria.cs:75 #, csharp-format msgid "Invalid compare operator for keyword '{0}'" msgstr "Неправильный оператор сравнения для команды '{0}'" #: src/Searching/VolumeSearchCriteria/EUSLSearchCriteria.cs:99 #: src/Searching/ItemSearchCriteria/EUSLSearchCriteria.cs:122 #, csharp-format msgid "Unknown keyword '{0}'" msgstr "Неизвестное ключевое слово '{0}'" #: src/Searching/VolumeSearchCriteria/EUSLSearchCriteria.cs:109 #: src/Searching/ItemSearchCriteria/EUSLSearchCriteria.cs:133 msgid "Invalid compare operator for a keyword that maps to textual content" msgstr "" "Неправильный оператор сравнения для команды, сопоставляющей текстовое " "содержимое" #: src/Searching/ItemSearchCriteria/EUSLSearchCriteria.cs:85 #, csharp-format msgid "Operand for keyword '{0}' must be a string" msgstr "Операнд для ключевого слова '{0}' должен быть строкой" #: src/Searching/ItemSearchCriteria/EUSLSearchCriteria.cs:94 #, csharp-format msgid "Unknown type '{0}'" msgstr "Неизвестный тип '{0}'" #: src/Searching/ItemSearchCriteria/EUSLSearchCriteria.cs:100 #, csharp-format msgid "Keyword '{0}' only supports the equality operator ('=')" msgstr "Ключевое слово \"{0} 'поддерживает только оператор равенства ('=')" #: src/Searching/AbstractEUSLSearchCriteria.cs:87 #: src/Searching/AbstractEUSLSearchCriteria.cs:91 #, csharp-format msgid "Parsing error: search statement is malformed at position {0}" msgstr "Синтаксическая ошибка: неправильный поисковый запрос в позиции {0}" #: src/VolumeScanner/AudioCdVolumeScanner.cs:55 msgid "Hashcode generation not implemented for audio cds yet." msgstr "Генерирование хеш-кода пока не включено для аудиодисков." #: src/VolumeScanner/AudioCdVolumeScanner.cs:97 msgid "No MusicBrainz metadata available for this disc." msgstr "Нет метаданных MusicBrainz для этого диска." #: src/VolumeScanner/AudioCdVolumeScanner.cs:102 msgid "" "The trackcount retrieved from MusicBrainz does not match the trackcount of " "the local disc. Skipped." msgstr "" "Список треков, полученный с MusicBrainz, не совпадает со списком треков на " "локальном диске. Пропущено." #: src/VolumeScanner/AudioCdVolumeScanner.cs:125 msgid "Error connecting to MusicBrainz server." msgstr "Ошибка соединения с сервером MusicBrainz." #: src/VolumeScanner/FilesystemVolumeScanner.cs:165 #, csharp-format msgid "Directory '{0}' not found. (Wrong filename encoding?)" msgstr "Каталог '{0} \"не найден. (Неправильная кодировка имени файла?)" #: src/VolumeScanner/FilesystemVolumeScanner.cs:174 #, csharp-format msgid "Skipped item '{0}' as it doesn't seem to be a real directory." msgstr "Элемент '{0}' пропущен, так как скорее всего не является каталогом." #: src/VolumeScanner/FilesystemVolumeScanner.cs:195 #: src/VolumeScanner/FilesystemVolumeScanner.cs:340 #, csharp-format msgid "Skipped symlink item '{0}' as the target does not exist." msgstr "Пропущенные ссылка '{0}', цели ссылки не существует." #: src/VolumeScanner/FilesystemVolumeScanner.cs:204 #: src/VolumeScanner/FilesystemVolumeScanner.cs:347 #, csharp-format msgid "" "Skipped symlink item '{0}' as it appears to point to a different drive " "('{1}')." msgstr "" "Пропущенные ссылка '{0}', кажется она указывает на другой диск ('{1}')." #: src/VolumeScanner/FilesystemVolumeScanner.cs:245 #, csharp-format msgid "File '{0}' not found. (Wrong filename encoding?)" msgstr "Файл '{0} \"не найден. (Неправильная кодировка имени файла?)" #: src/VolumeScanner/FilesystemVolumeScanner.cs:279 #, csharp-format msgid "Extracting metadata from file '{0}' failed. ({1})" msgstr "Извлечь метаданные из файла '{0}' не удалось. ({1})" #: src/VolumeScanner/FilesystemVolumeScanner.cs:310 #, csharp-format msgid "Error opening file '{0}', can't retrieve any mime/metadata. ({1})" msgstr "" "Ошибка при открытии файла '{0}', не возможно получить MIME/метаданные. ({1})" #: src/VolumeScanner/FilesystemVolumeScanner.cs:354 #, csharp-format msgid "" "Skipped symlink item '{0}' as it does not point to a regular file ('{1}')." msgstr "" "Пропущенные ссылка '{0} \", она не указывает на обычный файл (' {1} ')." #: src/VolumeScanner/FilesystemVolumeScanner.cs:363 #, csharp-format msgid "Skipped item '{0}' as it appears to be some kind of special file." msgstr "Пропущенн пункт '{0} \", кажется это специальный файл." #: src/VolumeScanner/FilesystemVolumeScanner.cs:381 #, csharp-format msgid "Unable to dump dir '{0}'. ({1})" msgstr "Не удаётся записать в дамп каталог '{0}'. ({1})" #: src/VolumeScanner/FilesystemVolumeScanner.cs:500 #, csharp-format msgid "Can't read LastWriteTime from item '{0}' ({1})." msgstr "Невозможно прочитать LastWriteTime из пункта '{0} \"({1})." #: src/VolumeScanner/FilesystemVolumeScanner.cs:664 #, csharp-format msgid "Failed to resolve target item for symlink '{0}'." msgstr "Не разрешено создавать символьную ссылку '{0}' для объекта." VolumeDB/po/tr.po0000664000175000017500000001136112067326706014027 0ustar patrickpatrick# Turkish translation for basenji # Copyright (c) 2010 Rosetta Contributors and Canonical Ltd 2010 # This file is distributed under the same license as the basenji package. # FIRST AUTHOR , 2010. # msgid "" msgstr "" "Project-Id-Version: basenji\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2012-07-15 15:49+0200\n" "PO-Revision-Date: 2010-07-10 13:42+0000\n" "Last-Translator: Cihan Ersoy \n" "Language-Team: Turkish \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2012-10-27 11:00+0000\n" "X-Generator: Launchpad (build 16194)\n" #: src/Searching/VolumeSearchCriteria/EUSLSearchCriteria.cs:74 #: src/Searching/ItemSearchCriteria/EUSLSearchCriteria.cs:65 #, csharp-format msgid "" "Operand for keyword '{0}' must be a number with an optional multiplier" msgstr "" #: src/Searching/VolumeSearchCriteria/EUSLSearchCriteria.cs:84 #: src/Searching/ItemSearchCriteria/EUSLSearchCriteria.cs:75 #, csharp-format msgid "Invalid compare operator for keyword '{0}'" msgstr "" #: src/Searching/VolumeSearchCriteria/EUSLSearchCriteria.cs:99 #: src/Searching/ItemSearchCriteria/EUSLSearchCriteria.cs:122 #, csharp-format msgid "Unknown keyword '{0}'" msgstr "Bilinmeyen '{0}' anahtar kelimesi" #: src/Searching/VolumeSearchCriteria/EUSLSearchCriteria.cs:109 #: src/Searching/ItemSearchCriteria/EUSLSearchCriteria.cs:133 msgid "Invalid compare operator for a keyword that maps to textual content" msgstr "" #: src/Searching/ItemSearchCriteria/EUSLSearchCriteria.cs:85 #, csharp-format msgid "Operand for keyword '{0}' must be a string" msgstr "" #: src/Searching/ItemSearchCriteria/EUSLSearchCriteria.cs:94 #, csharp-format msgid "Unknown type '{0}'" msgstr "Bilinmeyen '{0}' türü" #: src/Searching/ItemSearchCriteria/EUSLSearchCriteria.cs:100 #, csharp-format msgid "Keyword '{0}' only supports the equality operator ('=')" msgstr "" #: src/Searching/AbstractEUSLSearchCriteria.cs:87 #: src/Searching/AbstractEUSLSearchCriteria.cs:91 #, csharp-format msgid "Parsing error: search statement is malformed at position {0}" msgstr "" #: src/VolumeScanner/AudioCdVolumeScanner.cs:55 msgid "Hashcode generation not implemented for audio cds yet." msgstr "" #: src/VolumeScanner/AudioCdVolumeScanner.cs:97 msgid "No MusicBrainz metadata available for this disc." msgstr "" #: src/VolumeScanner/AudioCdVolumeScanner.cs:102 msgid "" "The trackcount retrieved from MusicBrainz does not match the trackcount of " "the local disc. Skipped." msgstr "" #: src/VolumeScanner/AudioCdVolumeScanner.cs:125 msgid "Error connecting to MusicBrainz server." msgstr "MusicBrainz sunucusuna bağlanma hatası." #: src/VolumeScanner/FilesystemVolumeScanner.cs:165 #, csharp-format msgid "Directory '{0}' not found. (Wrong filename encoding?)" msgstr "'{0}' dizini bulunamadı. (Hatalı dosya ismi kodlaması?)" #: src/VolumeScanner/FilesystemVolumeScanner.cs:174 #, csharp-format msgid "Skipped item '{0}' as it doesn't seem to be a real directory." msgstr "Gerçek bir dizin gibi gözükmediği için '{0}' ögesi atlanıldı." #: src/VolumeScanner/FilesystemVolumeScanner.cs:195 #: src/VolumeScanner/FilesystemVolumeScanner.cs:340 #, csharp-format msgid "Skipped symlink item '{0}' as the target does not exist." msgstr "" #: src/VolumeScanner/FilesystemVolumeScanner.cs:204 #: src/VolumeScanner/FilesystemVolumeScanner.cs:347 #, csharp-format msgid "" "Skipped symlink item '{0}' as it appears to point to a different drive " "('{1}')." msgstr "" #: src/VolumeScanner/FilesystemVolumeScanner.cs:245 #, csharp-format msgid "File '{0}' not found. (Wrong filename encoding?)" msgstr "'{0}' dosyası bulunamadı. (Hatalı dosya ismi kodlaması?)" #: src/VolumeScanner/FilesystemVolumeScanner.cs:279 #, csharp-format msgid "Extracting metadata from file '{0}' failed. ({1})" msgstr "" #: src/VolumeScanner/FilesystemVolumeScanner.cs:310 #, csharp-format msgid "Error opening file '{0}', can't retrieve any mime/metadata. ({1})" msgstr "" #: src/VolumeScanner/FilesystemVolumeScanner.cs:354 #, csharp-format msgid "" "Skipped symlink item '{0}' as it does not point to a regular file ('{1}')." msgstr "" #: src/VolumeScanner/FilesystemVolumeScanner.cs:363 #, csharp-format msgid "Skipped item '{0}' as it appears to be some kind of special file." msgstr "Özel bir dosya gibi gözüktüğü için '{0}' ögesi atlanıldı." #: src/VolumeScanner/FilesystemVolumeScanner.cs:381 #, csharp-format msgid "Unable to dump dir '{0}'. ({1})" msgstr "" #: src/VolumeScanner/FilesystemVolumeScanner.cs:500 #, csharp-format msgid "Can't read LastWriteTime from item '{0}' ({1})." msgstr "" #: src/VolumeScanner/FilesystemVolumeScanner.cs:664 #, csharp-format msgid "Failed to resolve target item for symlink '{0}'." msgstr "" VolumeDB/po/it.resources0000664000175000017500000001176712067326706015424 0ustar patrickpatricklSystem.Resources.ResourceReader, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089#System.Resources.RuntimeResourceSetPADPADP8֞xϴϼƾ_@,ZLxR(I|1 4IY;CKeNNDNcPÇBTUWDXhgCh\qkdqT93 * $q ~hB y ^Can't read LastWriteTime from item '{0}' ({1}).jDirectory '{0}' not found. (Wrong filename encoding?)NError connecting to MusicBrainz server.*Error opening file '{0}', can't retrieve any mime/metadata. ({1})`bExtracting metadata from file '{0}' failed. ({1})`Failed to resolve target item for symlink '{0}'.`File '{0}' not found. (Wrong filename encoding?)%lHashcode generation not implemented for audio cds yet.nInvalid compare operator for a keyword that maps to textual contentTInvalid compare operator for keyword '{0}'nKeyword '{0}' only supports the equality operator ('=')A`No MusicBrainz metadata available for this disc.Operand for keyword '{0}' must be a number with an optional multiplierTOperand for keyword '{0}' must be a string#xParsing error: search statement is malformed at position {0}bSkipped item '{0}' as it appears to be some kind of special file.zSkipped item '{0}' as it doesn't seem to be a real directory.Skipped symlink item '{0}' as it appears to point to a different drive ('{1}').,Skipped symlink item '{0}' as it does not point to a regular file ('{1}').{pSkipped symlink item '{0}' as the target does not exist.The trackcount retrieved from MusicBrainz does not match the trackcount of the local disc. Skipped.>Unable to dump dir '{0}'. ({1})z*Unknown keyword '{0}'$Unknown type '{0}'Project-Id-Version: basenji Report-Msgid-Bugs-To: FULL NAME POT-Creation-Date: 2012-07-15 15:49+0200 PO-Revision-Date: 2011-11-29 00:58+0000 Last-Translator: Fidel Nadera Language-Team: Italian MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Launchpad-Export-Date: 2012-10-27 11:00+0000 X-Generator: Launchpad (build 16194) BImpossibile leggere la data di modifica dell'elemento '{0}' ({1}).KImpossibile trovare la cartella '{0}'. (Codifica del nome del file errata?)4Errore durante la connessione al server MusicBrainz.HErrore apertura file '{0}', impossibile ottenere un mime/metadata. ({1})8Estrazione di metadati da file '{0}' non riuscita. ({1})?Impossibile risolvere il file puntato dal link simbolico '{0}'.GImpossibile trovare il file '{0}'. (Codifica del nome del file errata?) POT-Creation-Date: 2012-07-15 15:49+0200 PO-Revision-Date: 2010-12-12 05:49+0000 Last-Translator: Li Jin Language-Team: Chinese (Simplified) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Launchpad-Export-Date: 2012-10-27 11:00+0000 X-Generator: Launchpad (build 16194) (连接到 MusicBrainz 服务器出错。未知关键字 '{0}'未知类型 '{0}'VolumeDB/po/oc.po0000664000175000017500000001156112067326706014005 0ustar patrickpatrick# Occitan (post 1500) translation for basenji # Copyright (c) 2010 Rosetta Contributors and Canonical Ltd 2010 # This file is distributed under the same license as the basenji package. # FIRST AUTHOR , 2010. # msgid "" msgstr "" "Project-Id-Version: basenji\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2012-07-15 15:49+0200\n" "PO-Revision-Date: 2010-05-22 09:50+0000\n" "Last-Translator: Cédric VALMARY (Tot en òc) \n" "Language-Team: Occitan (post 1500) \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2012-10-27 11:00+0000\n" "X-Generator: Launchpad (build 16194)\n" #: src/Searching/VolumeSearchCriteria/EUSLSearchCriteria.cs:74 #: src/Searching/ItemSearchCriteria/EUSLSearchCriteria.cs:65 #, csharp-format msgid "" "Operand for keyword '{0}' must be a number with an optional multiplier" msgstr "" #: src/Searching/VolumeSearchCriteria/EUSLSearchCriteria.cs:84 #: src/Searching/ItemSearchCriteria/EUSLSearchCriteria.cs:75 #, csharp-format msgid "Invalid compare operator for keyword '{0}'" msgstr "" #: src/Searching/VolumeSearchCriteria/EUSLSearchCriteria.cs:99 #: src/Searching/ItemSearchCriteria/EUSLSearchCriteria.cs:122 #, csharp-format msgid "Unknown keyword '{0}'" msgstr "Mot clau desconegut '{0}'" #: src/Searching/VolumeSearchCriteria/EUSLSearchCriteria.cs:109 #: src/Searching/ItemSearchCriteria/EUSLSearchCriteria.cs:133 msgid "Invalid compare operator for a keyword that maps to textual content" msgstr "" #: src/Searching/ItemSearchCriteria/EUSLSearchCriteria.cs:85 #, csharp-format msgid "Operand for keyword '{0}' must be a string" msgstr "" #: src/Searching/ItemSearchCriteria/EUSLSearchCriteria.cs:94 #, csharp-format msgid "Unknown type '{0}'" msgstr "Tipe desconegut '{0}'" #: src/Searching/ItemSearchCriteria/EUSLSearchCriteria.cs:100 #, csharp-format msgid "Keyword '{0}' only supports the equality operator ('=')" msgstr "" #: src/Searching/AbstractEUSLSearchCriteria.cs:87 #: src/Searching/AbstractEUSLSearchCriteria.cs:91 #, csharp-format msgid "Parsing error: search statement is malformed at position {0}" msgstr "" #: src/VolumeScanner/AudioCdVolumeScanner.cs:55 msgid "Hashcode generation not implemented for audio cds yet." msgstr "" #: src/VolumeScanner/AudioCdVolumeScanner.cs:97 msgid "No MusicBrainz metadata available for this disc." msgstr "" #: src/VolumeScanner/AudioCdVolumeScanner.cs:102 msgid "" "The trackcount retrieved from MusicBrainz does not match the trackcount of " "the local disc. Skipped." msgstr "" #: src/VolumeScanner/AudioCdVolumeScanner.cs:125 msgid "Error connecting to MusicBrainz server." msgstr "Error al moment de la connexion al servidor MusicBrainz..." #: src/VolumeScanner/FilesystemVolumeScanner.cs:165 #, csharp-format msgid "Directory '{0}' not found. (Wrong filename encoding?)" msgstr "Dorsièr '{0}' pas trobat. (Marrit encodatge de fichièr ?)" #: src/VolumeScanner/FilesystemVolumeScanner.cs:174 #, csharp-format msgid "Skipped item '{0}' as it doesn't seem to be a real directory." msgstr "" #: src/VolumeScanner/FilesystemVolumeScanner.cs:195 #: src/VolumeScanner/FilesystemVolumeScanner.cs:340 #, csharp-format msgid "Skipped symlink item '{0}' as the target does not exist." msgstr "" #: src/VolumeScanner/FilesystemVolumeScanner.cs:204 #: src/VolumeScanner/FilesystemVolumeScanner.cs:347 #, csharp-format msgid "" "Skipped symlink item '{0}' as it appears to point to a different drive " "('{1}')." msgstr "" #: src/VolumeScanner/FilesystemVolumeScanner.cs:245 #, csharp-format msgid "File '{0}' not found. (Wrong filename encoding?)" msgstr "Fichièr '{0}' pas trobat. (Marrit encodatge de fichièr ?)" #: src/VolumeScanner/FilesystemVolumeScanner.cs:279 #, csharp-format msgid "Extracting metadata from file '{0}' failed. ({1})" msgstr "" #: src/VolumeScanner/FilesystemVolumeScanner.cs:310 #, csharp-format msgid "Error opening file '{0}', can't retrieve any mime/metadata. ({1})" msgstr "" #: src/VolumeScanner/FilesystemVolumeScanner.cs:354 #, csharp-format msgid "" "Skipped symlink item '{0}' as it does not point to a regular file ('{1}')." msgstr "" #: src/VolumeScanner/FilesystemVolumeScanner.cs:363 #, csharp-format msgid "Skipped item '{0}' as it appears to be some kind of special file." msgstr "" #: src/VolumeScanner/FilesystemVolumeScanner.cs:381 #, csharp-format msgid "Unable to dump dir '{0}'. ({1})" msgstr "Impossible de suprimir lo dorsièr '{0}'. ({1})" #: src/VolumeScanner/FilesystemVolumeScanner.cs:500 #, csharp-format msgid "Can't read LastWriteTime from item '{0}' ({1})." msgstr "" "Impossible de legir l'ora del darrièr enregistrament per aqueste objècte " "'{0}' ({1})." #: src/VolumeScanner/FilesystemVolumeScanner.cs:664 #, csharp-format msgid "Failed to resolve target item for symlink '{0}'." msgstr "Impossible de resòlvre l'objècte cibla de ligam simbolic '{0}'." VolumeDB/po/de.po0000664000175000017500000001410612067326706013772 0ustar patrickpatrick# German translation for basenji # Copyright (c) 2008 Rosetta Contributors and Canonical Ltd 2008 # This file is distributed under the same license as the basenji package. # FIRST AUTHOR , 2008. # msgid "" msgstr "" "Project-Id-Version: basenji\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2012-07-15 15:49+0200\n" "PO-Revision-Date: 2011-08-16 21:49+0000\n" "Last-Translator: Patrick Ulbrich \n" "Language-Team: German \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2012-10-27 11:00+0000\n" "X-Generator: Launchpad (build 16194)\n" #: src/Searching/VolumeSearchCriteria/EUSLSearchCriteria.cs:74 #: src/Searching/ItemSearchCriteria/EUSLSearchCriteria.cs:65 #, csharp-format msgid "" "Operand for keyword '{0}' must be a number with an optional multiplier" msgstr "" "Der Operand für das Schlüsselwort '{0}' muss eine Nummer mit einem " "optionalen Multiplikator sein" #: src/Searching/VolumeSearchCriteria/EUSLSearchCriteria.cs:84 #: src/Searching/ItemSearchCriteria/EUSLSearchCriteria.cs:75 #, csharp-format msgid "Invalid compare operator for keyword '{0}'" msgstr "Unzulässiger Vergleichsoperator für Schlüsselwort '{0}'" #: src/Searching/VolumeSearchCriteria/EUSLSearchCriteria.cs:99 #: src/Searching/ItemSearchCriteria/EUSLSearchCriteria.cs:122 #, csharp-format msgid "Unknown keyword '{0}'" msgstr "Unbekanntes Schlüsselwort '{0}'" #: src/Searching/VolumeSearchCriteria/EUSLSearchCriteria.cs:109 #: src/Searching/ItemSearchCriteria/EUSLSearchCriteria.cs:133 msgid "Invalid compare operator for a keyword that maps to textual content" msgstr "" "Unzulässiger Vergleichsoperator für ein Schlüsselwort das auf textuellen " "Inhalt abgebildet wird" #: src/Searching/ItemSearchCriteria/EUSLSearchCriteria.cs:85 #, csharp-format msgid "Operand for keyword '{0}' must be a string" msgstr "Der Operand für das Schlüsselwort '{0}' muss ein String sein" #: src/Searching/ItemSearchCriteria/EUSLSearchCriteria.cs:94 #, csharp-format msgid "Unknown type '{0}'" msgstr "Unbekannter type '{0}'" #: src/Searching/ItemSearchCriteria/EUSLSearchCriteria.cs:100 #, csharp-format msgid "Keyword '{0}' only supports the equality operator ('=')" msgstr "Das Schlüsselwort '{0}' erlaubt nur den Gleichheitsoperator ('=')" #: src/Searching/AbstractEUSLSearchCriteria.cs:87 #: src/Searching/AbstractEUSLSearchCriteria.cs:91 #, csharp-format msgid "Parsing error: search statement is malformed at position {0}" msgstr "" "Parsing Fehler: Der Suchausdruck ist an der Position {0} missgebildet" #: src/VolumeScanner/AudioCdVolumeScanner.cs:55 msgid "Hashcode generation not implemented for audio cds yet." msgstr "Hashcode-Berechnung ist noch nicht für Audio-CDs implementiert." #: src/VolumeScanner/AudioCdVolumeScanner.cs:97 msgid "No MusicBrainz metadata available for this disc." msgstr "Für diese CD sind keine MusicBrainz-Metadaten verfügbar." #: src/VolumeScanner/AudioCdVolumeScanner.cs:102 msgid "" "The trackcount retrieved from MusicBrainz does not match the trackcount of " "the local disc. Skipped." msgstr "" "Die Trackanzahl von MusicBrainz stimmt nicht mit der Trackanzahl der CD " "überein. Ausgelassen." #: src/VolumeScanner/AudioCdVolumeScanner.cs:125 msgid "Error connecting to MusicBrainz server." msgstr "Die Verbindung zum MusicBrainz-Server ist fehlgeschlagen." #: src/VolumeScanner/FilesystemVolumeScanner.cs:165 #, csharp-format msgid "Directory '{0}' not found. (Wrong filename encoding?)" msgstr "Verzeichnis '{0}' nicht gefunden. (Falsche Dateinamen-Kodierung?)" #: src/VolumeScanner/FilesystemVolumeScanner.cs:174 #, csharp-format msgid "Skipped item '{0}' as it doesn't seem to be a real directory." msgstr "" "Element '{0}' ausgelassen, da es kein echtes Verzeichnis zu sein scheint." #: src/VolumeScanner/FilesystemVolumeScanner.cs:195 #: src/VolumeScanner/FilesystemVolumeScanner.cs:340 #, csharp-format msgid "Skipped symlink item '{0}' as the target does not exist." msgstr "" "Symbolischer Link '{0}' wurde ausgelassen, da das Ziel nicht existiert." #: src/VolumeScanner/FilesystemVolumeScanner.cs:204 #: src/VolumeScanner/FilesystemVolumeScanner.cs:347 #, csharp-format msgid "" "Skipped symlink item '{0}' as it appears to point to a different drive " "('{1}')." msgstr "" "Symbolischer Link '{0}' wurde ausgelassen, da er auf ein anderes Laufwerk " "zeigt ('{1}')." #: src/VolumeScanner/FilesystemVolumeScanner.cs:245 #, csharp-format msgid "File '{0}' not found. (Wrong filename encoding?)" msgstr "Datei '{0}' nicht gefunden. (Falsche Dateinamen-Kodierung?)" #: src/VolumeScanner/FilesystemVolumeScanner.cs:279 #, csharp-format msgid "Extracting metadata from file '{0}' failed. ({1})" msgstr "Extrahieren der Metadaten aus Datei '{0}' fehlgeschlagen. ({1})" #: src/VolumeScanner/FilesystemVolumeScanner.cs:310 #, csharp-format msgid "Error opening file '{0}', can't retrieve any mime/metadata. ({1})" msgstr "" "Fehler beim Öffnen der Datei '{0}', Mime/Metadaten konnten nicht ermittelt " "werden. ({1})" #: src/VolumeScanner/FilesystemVolumeScanner.cs:354 #, csharp-format msgid "" "Skipped symlink item '{0}' as it does not point to a regular file ('{1}')." msgstr "" "Symbolischer Link '{0}' wurde ausgelassen, da er auf keine reguläre Datei " "zeigt ('{1}')." #: src/VolumeScanner/FilesystemVolumeScanner.cs:363 #, csharp-format msgid "Skipped item '{0}' as it appears to be some kind of special file." msgstr "" "Symbolischer Link '{0}' wurde ausgelassen, da er eine Spezialdatei zu sein " "scheint." #: src/VolumeScanner/FilesystemVolumeScanner.cs:381 #, csharp-format msgid "Unable to dump dir '{0}'. ({1})" msgstr "Verzeichnis '{0}' konnte nicht durchsucht werden. ({1})" #: src/VolumeScanner/FilesystemVolumeScanner.cs:500 #, csharp-format msgid "Can't read LastWriteTime from item '{0}' ({1})." msgstr "Kann das Änderungsdatum nicht von Element '{0}' lesen ({1})." #: src/VolumeScanner/FilesystemVolumeScanner.cs:664 #, csharp-format msgid "Failed to resolve target item for symlink '{0}'." msgstr "" "Das Auflösen des Zielelements für den symbolischen Link '{0}' ist " "fehlgeschlagen." VolumeDB/po/he.po0000664000175000017500000001372212067326706014001 0ustar patrickpatrick# Hebrew translation for basenji # Copyright (c) 2008 Rosetta Contributors and Canonical Ltd 2008 # This file is distributed under the same license as the basenji package. # FIRST AUTHOR , 2008. # msgid "" msgstr "" "Project-Id-Version: basenji\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2012-07-15 15:49+0200\n" "PO-Revision-Date: 2010-05-21 10:47+0000\n" "Last-Translator: Yaron \n" "Language-Team: Hebrew \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2012-10-27 11:00+0000\n" "X-Generator: Launchpad (build 16194)\n" #: src/Searching/VolumeSearchCriteria/EUSLSearchCriteria.cs:74 #: src/Searching/ItemSearchCriteria/EUSLSearchCriteria.cs:65 #, csharp-format msgid "" "Operand for keyword '{0}' must be a number with an optional multiplier" msgstr "" #: src/Searching/VolumeSearchCriteria/EUSLSearchCriteria.cs:84 #: src/Searching/ItemSearchCriteria/EUSLSearchCriteria.cs:75 #, csharp-format msgid "Invalid compare operator for keyword '{0}'" msgstr "" #: src/Searching/VolumeSearchCriteria/EUSLSearchCriteria.cs:99 #: src/Searching/ItemSearchCriteria/EUSLSearchCriteria.cs:122 #, csharp-format msgid "Unknown keyword '{0}'" msgstr "מילת המפתח '{0}' אינה מוכרת" #: src/Searching/VolumeSearchCriteria/EUSLSearchCriteria.cs:109 #: src/Searching/ItemSearchCriteria/EUSLSearchCriteria.cs:133 msgid "Invalid compare operator for a keyword that maps to textual content" msgstr "אופרטור ההשוואה שגוי עבור מילות מפתח שממפות לתוכן טקסטואלי" #: src/Searching/ItemSearchCriteria/EUSLSearchCriteria.cs:85 #, csharp-format msgid "Operand for keyword '{0}' must be a string" msgstr "" #: src/Searching/ItemSearchCriteria/EUSLSearchCriteria.cs:94 #, csharp-format msgid "Unknown type '{0}'" msgstr "הסוג '{0}' אינו ידוע" #: src/Searching/ItemSearchCriteria/EUSLSearchCriteria.cs:100 #, csharp-format msgid "Keyword '{0}' only supports the equality operator ('=')" msgstr "" #: src/Searching/AbstractEUSLSearchCriteria.cs:87 #: src/Searching/AbstractEUSLSearchCriteria.cs:91 #, csharp-format msgid "Parsing error: search statement is malformed at position {0}" msgstr "שגיאת ניתוח: הביטוי לחיפוש שגוי במיקום {0}" #: src/VolumeScanner/AudioCdVolumeScanner.cs:55 msgid "Hashcode generation not implemented for audio cds yet." msgstr "האפשרות ליצירת קוד גיבוב אינה מוטמעת עדיין עבור תקליטורים." #: src/VolumeScanner/AudioCdVolumeScanner.cs:97 msgid "No MusicBrainz metadata available for this disc." msgstr "אין נתוני מטא זמינים עבור תקליטור זה." #: src/VolumeScanner/AudioCdVolumeScanner.cs:102 msgid "" "The trackcount retrieved from MusicBrainz does not match the trackcount of " "the local disc. Skipped." msgstr "" "מספור הרצועות שהתקבל מ־MusicBrainz אינו תואם למספור הרצועות בתקליטור המקומי. " "מתבצע דילוג." #: src/VolumeScanner/AudioCdVolumeScanner.cs:125 msgid "Error connecting to MusicBrainz server." msgstr "ארעה שגיאה בחיבור אל שרת MusicBrainz." #: src/VolumeScanner/FilesystemVolumeScanner.cs:165 #, csharp-format msgid "Directory '{0}' not found. (Wrong filename encoding?)" msgstr "התיקייה '{0}' לא נמצאה. (קידוד שם הקובץ שגוי?)" #: src/VolumeScanner/FilesystemVolumeScanner.cs:174 #, csharp-format msgid "Skipped item '{0}' as it doesn't seem to be a real directory." msgstr "הפריט '{0}' נפסח כיוון שלא נראה כי הוא תיקייה אמיתית." #: src/VolumeScanner/FilesystemVolumeScanner.cs:195 #: src/VolumeScanner/FilesystemVolumeScanner.cs:340 #, csharp-format msgid "Skipped symlink item '{0}' as the target does not exist." msgstr "הקישור הסמלי '{0}' נפסח כיוון שהמטרה לא קיימת." #: src/VolumeScanner/FilesystemVolumeScanner.cs:204 #: src/VolumeScanner/FilesystemVolumeScanner.cs:347 #, csharp-format msgid "" "Skipped symlink item '{0}' as it appears to point to a different drive " "('{1}')." msgstr "" "פריט הקישור הסמלי '{0}' נפסח כיוון שנראה כי הוא מקשר לכונן אחר ('{1}')." #: src/VolumeScanner/FilesystemVolumeScanner.cs:245 #, csharp-format msgid "File '{0}' not found. (Wrong filename encoding?)" msgstr "הקובץ '{0}' לא נמצא. (קידוד שם הקובץ שגוי?)" #: src/VolumeScanner/FilesystemVolumeScanner.cs:279 #, csharp-format msgid "Extracting metadata from file '{0}' failed. ({1})" msgstr "" #: src/VolumeScanner/FilesystemVolumeScanner.cs:310 #, csharp-format msgid "Error opening file '{0}', can't retrieve any mime/metadata. ({1})" msgstr "שגיאה בפתיחת הקובץ '{0}', לא ניתן לאחזר mime/נתוני־מטא. ({1})" #: src/VolumeScanner/FilesystemVolumeScanner.cs:354 #, csharp-format msgid "" "Skipped symlink item '{0}' as it does not point to a regular file ('{1}')." msgstr "פריט הקישור הסמלי '{0}' נפסח כיוון שאינו מפנה לקובץ רגיל ('{1}')." #: src/VolumeScanner/FilesystemVolumeScanner.cs:363 #, csharp-format msgid "Skipped item '{0}' as it appears to be some kind of special file." msgstr "הפריט '{0}' נפסח כיוון שנראה כי הוא סוג של קובץ מיוחד." #: src/VolumeScanner/FilesystemVolumeScanner.cs:381 #, csharp-format msgid "Unable to dump dir '{0}'. ({1})" msgstr "לא ניתן לבצע אגירה של התיקייה '{0}'. ({1})" #: src/VolumeScanner/FilesystemVolumeScanner.cs:500 #, csharp-format msgid "Can't read LastWriteTime from item '{0}' ({1})." msgstr "לא ניתן לקרוא את LastWriteTime מהפריט '{0}' ({1})." #: src/VolumeScanner/FilesystemVolumeScanner.cs:664 #, csharp-format msgid "Failed to resolve target item for symlink '{0}'." msgstr "כשל באיחזור פריט היעד עבור הקישור הסמלי '{0}'." VolumeDB/po/es.po0000664000175000017500000001421612067326706014013 0ustar patrickpatrick# Spanish translation for basenji # Copyright (c) 2009 Rosetta Contributors and Canonical Ltd 2009 # This file is distributed under the same license as the basenji package. # FIRST AUTHOR , 2009. # msgid "" msgstr "" "Project-Id-Version: basenji\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2012-07-15 15:49+0200\n" "PO-Revision-Date: 2011-08-22 07:01+0000\n" "Last-Translator: Alfredo Hernández \n" "Language-Team: Spanish \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2012-11-18 12:32+0000\n" "X-Generator: Launchpad (build 16278)\n" #: src/Searching/VolumeSearchCriteria/EUSLSearchCriteria.cs:74 #: src/Searching/ItemSearchCriteria/EUSLSearchCriteria.cs:65 #, csharp-format msgid "" "Operand for keyword '{0}' must be a number with an optional multiplier" msgstr "" "El operando para la palabra clave «{0}» debe ser un número con un " "multiplicador opcional" #: src/Searching/VolumeSearchCriteria/EUSLSearchCriteria.cs:84 #: src/Searching/ItemSearchCriteria/EUSLSearchCriteria.cs:75 #, csharp-format msgid "Invalid compare operator for keyword '{0}'" msgstr "Operador de comparación inválido para la palabra clave «{0}»" #: src/Searching/VolumeSearchCriteria/EUSLSearchCriteria.cs:99 #: src/Searching/ItemSearchCriteria/EUSLSearchCriteria.cs:122 #, csharp-format msgid "Unknown keyword '{0}'" msgstr "Palabra clave desconocida «{0}»" #: src/Searching/VolumeSearchCriteria/EUSLSearchCriteria.cs:109 #: src/Searching/ItemSearchCriteria/EUSLSearchCriteria.cs:133 msgid "Invalid compare operator for a keyword that maps to textual content" msgstr "" "Operador de comparación no válido para una palabra clave que mapea a " "contenido contextual" #: src/Searching/ItemSearchCriteria/EUSLSearchCriteria.cs:85 #, csharp-format msgid "Operand for keyword '{0}' must be a string" msgstr "El operando de la palabra clave «{0}» debe ser una cadena" #: src/Searching/ItemSearchCriteria/EUSLSearchCriteria.cs:94 #, csharp-format msgid "Unknown type '{0}'" msgstr "Tipo desconocido «{0}»" #: src/Searching/ItemSearchCriteria/EUSLSearchCriteria.cs:100 #, csharp-format msgid "Keyword '{0}' only supports the equality operator ('=')" msgstr "La palabra clave «{0}» sólo soporta operadores de igualación ('=')" #: src/Searching/AbstractEUSLSearchCriteria.cs:87 #: src/Searching/AbstractEUSLSearchCriteria.cs:91 #, csharp-format msgid "Parsing error: search statement is malformed at position {0}" msgstr "" "Error de análisis: la sentencia de búsqueda está formada incorrectamente en " "la posición {0}" #: src/VolumeScanner/AudioCdVolumeScanner.cs:55 msgid "Hashcode generation not implemented for audio cds yet." msgstr "Generación de código hash aún no implementada para CDs de audio." #: src/VolumeScanner/AudioCdVolumeScanner.cs:97 msgid "No MusicBrainz metadata available for this disc." msgstr "No hay metadatos de MusicBrainz disponibles para este disco." #: src/VolumeScanner/AudioCdVolumeScanner.cs:102 msgid "" "The trackcount retrieved from MusicBrainz does not match the trackcount of " "the local disc. Skipped." msgstr "" "La cuenta de pistas obtenida de MusicBrainz no concuerda con la cuenta de " "pistas del disco local. Se omitirá." #: src/VolumeScanner/AudioCdVolumeScanner.cs:125 msgid "Error connecting to MusicBrainz server." msgstr "Error al conectarse con el servidor MusicBrainz." #: src/VolumeScanner/FilesystemVolumeScanner.cs:165 #, csharp-format msgid "Directory '{0}' not found. (Wrong filename encoding?)" msgstr "" "Directorio «{0}» no encontrado. (¿Mala codificación del nombre de archivo?)" #: src/VolumeScanner/FilesystemVolumeScanner.cs:174 #, csharp-format msgid "Skipped item '{0}' as it doesn't seem to be a real directory." msgstr "" "Se ha saltado el elemento «{0}» dado que no parece ser un directorio real." #: src/VolumeScanner/FilesystemVolumeScanner.cs:195 #: src/VolumeScanner/FilesystemVolumeScanner.cs:340 #, csharp-format msgid "Skipped symlink item '{0}' as the target does not exist." msgstr "" "Saltado el elemento de symlink «{0}» dado que el destino parece no existir." #: src/VolumeScanner/FilesystemVolumeScanner.cs:204 #: src/VolumeScanner/FilesystemVolumeScanner.cs:347 #, csharp-format msgid "" "Skipped symlink item '{0}' as it appears to point to a different drive " "('{1}')." msgstr "" "Se ha omitido el elemento symlink «{0}» ya que parece apuntar a una unidad " "diferente («{1}»)." #: src/VolumeScanner/FilesystemVolumeScanner.cs:245 #, csharp-format msgid "File '{0}' not found. (Wrong filename encoding?)" msgstr "" "No se ha encontrado el archivo «{0}». (¿Mala codificación del nombre de " "archivo?)" #: src/VolumeScanner/FilesystemVolumeScanner.cs:279 #, csharp-format msgid "Extracting metadata from file '{0}' failed. ({1})" msgstr "La extracción de los metadatos del archivo «{0}» ha fallado. ({1})" #: src/VolumeScanner/FilesystemVolumeScanner.cs:310 #, csharp-format msgid "Error opening file '{0}', can't retrieve any mime/metadata. ({1})" msgstr "" "Error al abrir el archivo «{0}», no se puede recuperar ningún MIME/metadato. " "({1})" #: src/VolumeScanner/FilesystemVolumeScanner.cs:354 #, csharp-format msgid "" "Skipped symlink item '{0}' as it does not point to a regular file ('{1}')." msgstr "" "Se ha omitido el ítem symlink «{0}» al no apuntar a un fichero regular " "('{1}')." #: src/VolumeScanner/FilesystemVolumeScanner.cs:363 #, csharp-format msgid "Skipped item '{0}' as it appears to be some kind of special file." msgstr "" "Se ha ignorado el elemento «{0}» debido a que parece ser algún tipo de " "fichero especial." #: src/VolumeScanner/FilesystemVolumeScanner.cs:381 #, csharp-format msgid "Unable to dump dir '{0}'. ({1})" msgstr "Imposible volcar el directorio «{0}». ({1})" #: src/VolumeScanner/FilesystemVolumeScanner.cs:500 #, csharp-format msgid "Can't read LastWriteTime from item '{0}' ({1})." msgstr "No se puede leer LastWriteTime del elemento «{0}» ({1})." #: src/VolumeScanner/FilesystemVolumeScanner.cs:664 #, csharp-format msgid "Failed to resolve target item for symlink '{0}'." msgstr "Error al resolver el elemento destino para el symlink «{0}»." VolumeDB/po/hu.po0000664000175000017500000001133712067326706014021 0ustar patrickpatrick# Hungarian translation for basenji # Copyright (c) 2010 Rosetta Contributors and Canonical Ltd 2010 # This file is distributed under the same license as the basenji package. # FIRST AUTHOR , 2010. # msgid "" msgstr "" "Project-Id-Version: basenji\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2012-07-15 15:49+0200\n" "PO-Revision-Date: 2010-08-16 05:56+0000\n" "Last-Translator: Polesz \n" "Language-Team: Hungarian \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2012-10-27 11:00+0000\n" "X-Generator: Launchpad (build 16194)\n" #: src/Searching/VolumeSearchCriteria/EUSLSearchCriteria.cs:74 #: src/Searching/ItemSearchCriteria/EUSLSearchCriteria.cs:65 #, csharp-format msgid "" "Operand for keyword '{0}' must be a number with an optional multiplier" msgstr "" #: src/Searching/VolumeSearchCriteria/EUSLSearchCriteria.cs:84 #: src/Searching/ItemSearchCriteria/EUSLSearchCriteria.cs:75 #, csharp-format msgid "Invalid compare operator for keyword '{0}'" msgstr "" #: src/Searching/VolumeSearchCriteria/EUSLSearchCriteria.cs:99 #: src/Searching/ItemSearchCriteria/EUSLSearchCriteria.cs:122 #, csharp-format msgid "Unknown keyword '{0}'" msgstr "Ismeretlen kulcsszó '{0}'" #: src/Searching/VolumeSearchCriteria/EUSLSearchCriteria.cs:109 #: src/Searching/ItemSearchCriteria/EUSLSearchCriteria.cs:133 msgid "Invalid compare operator for a keyword that maps to textual content" msgstr "" #: src/Searching/ItemSearchCriteria/EUSLSearchCriteria.cs:85 #, csharp-format msgid "Operand for keyword '{0}' must be a string" msgstr "" #: src/Searching/ItemSearchCriteria/EUSLSearchCriteria.cs:94 #, csharp-format msgid "Unknown type '{0}'" msgstr "Ismeretlen típus '{0}'" #: src/Searching/ItemSearchCriteria/EUSLSearchCriteria.cs:100 #, csharp-format msgid "Keyword '{0}' only supports the equality operator ('=')" msgstr "" #: src/Searching/AbstractEUSLSearchCriteria.cs:87 #: src/Searching/AbstractEUSLSearchCriteria.cs:91 #, csharp-format msgid "Parsing error: search statement is malformed at position {0}" msgstr "" #: src/VolumeScanner/AudioCdVolumeScanner.cs:55 msgid "Hashcode generation not implemented for audio cds yet." msgstr "Hash kód készítés nem megvalósított audio cd esetén." #: src/VolumeScanner/AudioCdVolumeScanner.cs:97 msgid "No MusicBrainz metadata available for this disc." msgstr "Nincs MusicBrainz metaadat ehhez a lemezhez." #: src/VolumeScanner/AudioCdVolumeScanner.cs:102 msgid "" "The trackcount retrieved from MusicBrainz does not match the trackcount of " "the local disc. Skipped." msgstr "" #: src/VolumeScanner/AudioCdVolumeScanner.cs:125 msgid "Error connecting to MusicBrainz server." msgstr "Nem sikerült csatlakozni a MusicBrainz-kiszolgálóhoz." #: src/VolumeScanner/FilesystemVolumeScanner.cs:165 #, csharp-format msgid "Directory '{0}' not found. (Wrong filename encoding?)" msgstr "Könyvtár '{0}' nem található. (Rossz karakterkódolás?)" #: src/VolumeScanner/FilesystemVolumeScanner.cs:174 #, csharp-format msgid "Skipped item '{0}' as it doesn't seem to be a real directory." msgstr "" #: src/VolumeScanner/FilesystemVolumeScanner.cs:195 #: src/VolumeScanner/FilesystemVolumeScanner.cs:340 #, csharp-format msgid "Skipped symlink item '{0}' as the target does not exist." msgstr "" #: src/VolumeScanner/FilesystemVolumeScanner.cs:204 #: src/VolumeScanner/FilesystemVolumeScanner.cs:347 #, csharp-format msgid "" "Skipped symlink item '{0}' as it appears to point to a different drive " "('{1}')." msgstr "" #: src/VolumeScanner/FilesystemVolumeScanner.cs:245 #, csharp-format msgid "File '{0}' not found. (Wrong filename encoding?)" msgstr "Fájl '{0}' nem található. (Rossz fájlnév kódolás?)" #: src/VolumeScanner/FilesystemVolumeScanner.cs:279 #, csharp-format msgid "Extracting metadata from file '{0}' failed. ({1})" msgstr "" #: src/VolumeScanner/FilesystemVolumeScanner.cs:310 #, csharp-format msgid "Error opening file '{0}', can't retrieve any mime/metadata. ({1})" msgstr "" #: src/VolumeScanner/FilesystemVolumeScanner.cs:354 #, csharp-format msgid "" "Skipped symlink item '{0}' as it does not point to a regular file ('{1}')." msgstr "" #: src/VolumeScanner/FilesystemVolumeScanner.cs:363 #, csharp-format msgid "Skipped item '{0}' as it appears to be some kind of special file." msgstr "" #: src/VolumeScanner/FilesystemVolumeScanner.cs:381 #, csharp-format msgid "Unable to dump dir '{0}'. ({1})" msgstr "" #: src/VolumeScanner/FilesystemVolumeScanner.cs:500 #, csharp-format msgid "Can't read LastWriteTime from item '{0}' ({1})." msgstr "" #: src/VolumeScanner/FilesystemVolumeScanner.cs:664 #, csharp-format msgid "Failed to resolve target item for symlink '{0}'." msgstr "" VolumeDB/po/nl.po0000664000175000017500000001337412067326706014021 0ustar patrickpatrick# Dutch translation for basenji # Copyright (c) 2011 Rosetta Contributors and Canonical Ltd 2011 # This file is distributed under the same license as the basenji package. # FIRST AUTHOR , 2011. # msgid "" msgstr "" "Project-Id-Version: basenji\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2012-07-15 15:49+0200\n" "PO-Revision-Date: 2011-04-05 03:31+0000\n" "Last-Translator: Bjorn Robijns \n" "Language-Team: Dutch \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2012-10-27 11:00+0000\n" "X-Generator: Launchpad (build 16194)\n" #: src/Searching/VolumeSearchCriteria/EUSLSearchCriteria.cs:74 #: src/Searching/ItemSearchCriteria/EUSLSearchCriteria.cs:65 #, csharp-format msgid "" "Operand for keyword '{0}' must be a number with an optional multiplier" msgstr "Operator voor het trefwoord '{0}' moet een nummer zijn" #: src/Searching/VolumeSearchCriteria/EUSLSearchCriteria.cs:84 #: src/Searching/ItemSearchCriteria/EUSLSearchCriteria.cs:75 #, csharp-format msgid "Invalid compare operator for keyword '{0}'" msgstr "Ongeldige vergelijkingsoperator voor het trefwoord '{0}'" #: src/Searching/VolumeSearchCriteria/EUSLSearchCriteria.cs:99 #: src/Searching/ItemSearchCriteria/EUSLSearchCriteria.cs:122 #, csharp-format msgid "Unknown keyword '{0}'" msgstr "Onbekend trefwoord '{0}'" #: src/Searching/VolumeSearchCriteria/EUSLSearchCriteria.cs:109 #: src/Searching/ItemSearchCriteria/EUSLSearchCriteria.cs:133 msgid "Invalid compare operator for a keyword that maps to textual content" msgstr "Ongeldige vergelijkingsoperator voor het trefwoord dat tekst inhoud" #: src/Searching/ItemSearchCriteria/EUSLSearchCriteria.cs:85 #, csharp-format msgid "Operand for keyword '{0}' must be a string" msgstr "Operator voor het trefwoord '{0}' moet tekst zijn" #: src/Searching/ItemSearchCriteria/EUSLSearchCriteria.cs:94 #, csharp-format msgid "Unknown type '{0}'" msgstr "Onbekend type '{0}'" #: src/Searching/ItemSearchCriteria/EUSLSearchCriteria.cs:100 #, csharp-format msgid "Keyword '{0}' only supports the equality operator ('=')" msgstr "Trefwoord '{0}' ondersteunt enkel de gelijkheidsoperator ('=')" #: src/Searching/AbstractEUSLSearchCriteria.cs:87 #: src/Searching/AbstractEUSLSearchCriteria.cs:91 #, csharp-format msgid "Parsing error: search statement is malformed at position {0}" msgstr "Fout bij het ontleden: zoekterm staat op verkeerde positie {0}" #: src/VolumeScanner/AudioCdVolumeScanner.cs:55 msgid "Hashcode generation not implemented for audio cds yet." msgstr "Hashcode nog niet ingeprogrammeerd voor audio cd's." #: src/VolumeScanner/AudioCdVolumeScanner.cs:97 msgid "No MusicBrainz metadata available for this disc." msgstr "Geen MusicBrainz metadata beschikbaar voor deze schijf." #: src/VolumeScanner/AudioCdVolumeScanner.cs:102 msgid "" "The trackcount retrieved from MusicBrainz does not match the trackcount of " "the local disc. Skipped." msgstr "" "Het nummeraantal opgehaald van MusicBrainz stemt niet overeen met het " "nummeraantal op de lokale schijf. Overgeslagen." #: src/VolumeScanner/AudioCdVolumeScanner.cs:125 msgid "Error connecting to MusicBrainz server." msgstr "Fout bij het verbinden met de MusicBrainz-server." #: src/VolumeScanner/FilesystemVolumeScanner.cs:165 #, csharp-format msgid "Directory '{0}' not found. (Wrong filename encoding?)" msgstr "Map '{0}' niet gevonden. (Foute bestandsnaam gecodeerd?)" #: src/VolumeScanner/FilesystemVolumeScanner.cs:174 #, csharp-format msgid "Skipped item '{0}' as it doesn't seem to be a real directory." msgstr "Item '{0}' overgeslaan, map blijkt niet te bestaan." #: src/VolumeScanner/FilesystemVolumeScanner.cs:195 #: src/VolumeScanner/FilesystemVolumeScanner.cs:340 #, csharp-format msgid "Skipped symlink item '{0}' as the target does not exist." msgstr "Symlink item '{0}' overgeslagen omdat doel niet bestaat." #: src/VolumeScanner/FilesystemVolumeScanner.cs:204 #: src/VolumeScanner/FilesystemVolumeScanner.cs:347 #, csharp-format msgid "" "Skipped symlink item '{0}' as it appears to point to a different drive " "('{1}')." msgstr "" "Symlink item '{0}' overgeslagen omdat deze verwijst naar een ander station " "('{1}')." #: src/VolumeScanner/FilesystemVolumeScanner.cs:245 #, csharp-format msgid "File '{0}' not found. (Wrong filename encoding?)" msgstr "Bestand '{0}' niet gevonden. (Foute bestandsnaam gecodeerd?)" #: src/VolumeScanner/FilesystemVolumeScanner.cs:279 #, csharp-format msgid "Extracting metadata from file '{0}' failed. ({1})" msgstr "" #: src/VolumeScanner/FilesystemVolumeScanner.cs:310 #, csharp-format msgid "Error opening file '{0}', can't retrieve any mime/metadata. ({1})" msgstr "" "Fout bij het openen van bestand '{0}', er kan geen mime/metadata opgehaald " "worden. ({1})" #: src/VolumeScanner/FilesystemVolumeScanner.cs:354 #, csharp-format msgid "" "Skipped symlink item '{0}' as it does not point to a regular file ('{1}')." msgstr "" "Symlink item '{0}' overgeslagen omdat deze niet naar een standaard bestand " "verwijst ('{1}')." #: src/VolumeScanner/FilesystemVolumeScanner.cs:363 #, csharp-format msgid "Skipped item '{0}' as it appears to be some kind of special file." msgstr "" "Item '{0}' overgeslagen omdat het een speciaal bestand blijkt te zijn." #: src/VolumeScanner/FilesystemVolumeScanner.cs:381 #, csharp-format msgid "Unable to dump dir '{0}'. ({1})" msgstr "Kan map '{0}' niet dumpen. ({1})" #: src/VolumeScanner/FilesystemVolumeScanner.cs:500 #, csharp-format msgid "Can't read LastWriteTime from item '{0}' ({1})." msgstr "Kan LastWriteTime niet lezen voor item '{0}' ({1})." #: src/VolumeScanner/FilesystemVolumeScanner.cs:664 #, csharp-format msgid "Failed to resolve target item for symlink '{0}'." msgstr "Mislukt om symlink item '{0}' doel te verhelpen." VolumeDB/po/pt_BR.po0000664000175000017500000001400412067326706014405 0ustar patrickpatrick# Brazilian Portuguese translation for basenji # Copyright (c) 2010 Rosetta Contributors and Canonical Ltd 2010 # This file is distributed under the same license as the basenji package. # FIRST AUTHOR , 2010. # msgid "" msgstr "" "Project-Id-Version: basenji\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2012-07-15 15:49+0200\n" "PO-Revision-Date: 2011-09-07 13:10+0000\n" "Last-Translator: Marcos Oliveira da Cruz \n" "Language-Team: Brazilian Portuguese \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2012-10-27 11:00+0000\n" "X-Generator: Launchpad (build 16194)\n" #: src/Searching/VolumeSearchCriteria/EUSLSearchCriteria.cs:74 #: src/Searching/ItemSearchCriteria/EUSLSearchCriteria.cs:65 #, csharp-format msgid "" "Operand for keyword '{0}' must be a number with an optional multiplier" msgstr "" "Operando para a palavra-chave '{0}' tem de ser um número com um " "multiplicador opcional" #: src/Searching/VolumeSearchCriteria/EUSLSearchCriteria.cs:84 #: src/Searching/ItemSearchCriteria/EUSLSearchCriteria.cs:75 #, csharp-format msgid "Invalid compare operator for keyword '{0}'" msgstr "Operador de comparação inválido para a palavra-chave '{0}'" #: src/Searching/VolumeSearchCriteria/EUSLSearchCriteria.cs:99 #: src/Searching/ItemSearchCriteria/EUSLSearchCriteria.cs:122 #, csharp-format msgid "Unknown keyword '{0}'" msgstr "Palavra-chave desconhecida '{0}'" #: src/Searching/VolumeSearchCriteria/EUSLSearchCriteria.cs:109 #: src/Searching/ItemSearchCriteria/EUSLSearchCriteria.cs:133 msgid "Invalid compare operator for a keyword that maps to textual content" msgstr "" "Operador de comparação inválido para uma palavra-chave que mapeia o contexto " "textual" #: src/Searching/ItemSearchCriteria/EUSLSearchCriteria.cs:85 #, csharp-format msgid "Operand for keyword '{0}' must be a string" msgstr "Operando para a palavra-chave '{0}' tem de ser uma string" #: src/Searching/ItemSearchCriteria/EUSLSearchCriteria.cs:94 #, csharp-format msgid "Unknown type '{0}'" msgstr "Tipo desconhecido '{0}'" #: src/Searching/ItemSearchCriteria/EUSLSearchCriteria.cs:100 #, csharp-format msgid "Keyword '{0}' only supports the equality operator ('=')" msgstr "Palavra-chave '{0}' suporta apenas o operador de igualdade ('=')" #: src/Searching/AbstractEUSLSearchCriteria.cs:87 #: src/Searching/AbstractEUSLSearchCriteria.cs:91 #, csharp-format msgid "Parsing error: search statement is malformed at position {0}" msgstr "Erro na análise: afirmação de procura está malformada na posição {0}" #: src/VolumeScanner/AudioCdVolumeScanner.cs:55 msgid "Hashcode generation not implemented for audio cds yet." msgstr "Geração do hash ainda não está implementada para CDs de áudio" #: src/VolumeScanner/AudioCdVolumeScanner.cs:97 msgid "No MusicBrainz metadata available for this disc." msgstr "Não há metadados do MusicBrainz disponíveis para este disco." #: src/VolumeScanner/AudioCdVolumeScanner.cs:102 msgid "" "The trackcount retrieved from MusicBrainz does not match the trackcount of " "the local disc. Skipped." msgstr "" "O número de faixas obtido do MusicBrainz não combina com o número de faixas " "do disco local. Pulado." #: src/VolumeScanner/AudioCdVolumeScanner.cs:125 msgid "Error connecting to MusicBrainz server." msgstr "Erro ao conectar ao servidor MusicBrainz." #: src/VolumeScanner/FilesystemVolumeScanner.cs:165 #, csharp-format msgid "Directory '{0}' not found. (Wrong filename encoding?)" msgstr "" "Diretório '{0}' não encontrado. (Codificação do nome do arquivo incorreta?)" #: src/VolumeScanner/FilesystemVolumeScanner.cs:174 #, csharp-format msgid "Skipped item '{0}' as it doesn't seem to be a real directory." msgstr "Item '{0}' pulado pois não parece ser uma pasta verdadeira." #: src/VolumeScanner/FilesystemVolumeScanner.cs:195 #: src/VolumeScanner/FilesystemVolumeScanner.cs:340 #, csharp-format msgid "Skipped symlink item '{0}' as the target does not exist." msgstr "Pulado item em link simbólico '{0}' porque o destino não existe." #: src/VolumeScanner/FilesystemVolumeScanner.cs:204 #: src/VolumeScanner/FilesystemVolumeScanner.cs:347 #, csharp-format msgid "" "Skipped symlink item '{0}' as it appears to point to a different drive " "('{1}')." msgstr "" "Pulado item em link simbólico '{0}' porque ele aponta para um drive " "diferente ('{1}')." #: src/VolumeScanner/FilesystemVolumeScanner.cs:245 #, csharp-format msgid "File '{0}' not found. (Wrong filename encoding?)" msgstr "" "Arquivo '{0}' não encontrado. (Codificação do nome do arquivo errada?)" #: src/VolumeScanner/FilesystemVolumeScanner.cs:279 #, csharp-format msgid "Extracting metadata from file '{0}' failed. ({1})" msgstr "Extraindo metadados do arquivo '{0}' falhou. ({1})" #: src/VolumeScanner/FilesystemVolumeScanner.cs:310 #, csharp-format msgid "Error opening file '{0}', can't retrieve any mime/metadata. ({1})" msgstr "" "Erro carregando o arquivo '{0}', não foi possível obter dados mime/metadata. " "({1})" #: src/VolumeScanner/FilesystemVolumeScanner.cs:354 #, csharp-format msgid "" "Skipped symlink item '{0}' as it does not point to a regular file ('{1}')." msgstr "" "Pulado o link simbólico '{0}' pois não aponta para um arquivo regular " "('{1}')." #: src/VolumeScanner/FilesystemVolumeScanner.cs:363 #, csharp-format msgid "Skipped item '{0}' as it appears to be some kind of special file." msgstr "Item '{0}' pulado pois parece ser algum tipo de arquivo especial." #: src/VolumeScanner/FilesystemVolumeScanner.cs:381 #, csharp-format msgid "Unable to dump dir '{0}'. ({1})" msgstr "Não foi possível limpar diretório '{0}'. ({1})" #: src/VolumeScanner/FilesystemVolumeScanner.cs:500 #, csharp-format msgid "Can't read LastWriteTime from item '{0}' ({1})." msgstr "Não foi possível ler HoraDaUltimaEscrita do item '{0}' ({1})." #: src/VolumeScanner/FilesystemVolumeScanner.cs:664 #, csharp-format msgid "Failed to resolve target item for symlink '{0}'." msgstr "Falha ao resolver o destino do link simbólico '{0}'." VolumeDB/po/pl.po0000664000175000017500000001351312067326706014016 0ustar patrickpatrick# Polish translation for basenji # Copyright (c) 2010 Rosetta Contributors and Canonical Ltd 2010 # This file is distributed under the same license as the basenji package. # FIRST AUTHOR , 2010. # msgid "" msgstr "" "Project-Id-Version: basenji\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2012-07-15 15:49+0200\n" "PO-Revision-Date: 2010-12-20 19:23+0000\n" "Last-Translator: Piotr Strębski \n" "Language-Team: Polish \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2012-10-27 11:00+0000\n" "X-Generator: Launchpad (build 16194)\n" #: src/Searching/VolumeSearchCriteria/EUSLSearchCriteria.cs:74 #: src/Searching/ItemSearchCriteria/EUSLSearchCriteria.cs:65 #, csharp-format msgid "" "Operand for keyword '{0}' must be a number with an optional multiplier" msgstr "" "Argument dla słowa kluczowego '{0}' musi być liczbą z ewentualnym mnożnikiem" #: src/Searching/VolumeSearchCriteria/EUSLSearchCriteria.cs:84 #: src/Searching/ItemSearchCriteria/EUSLSearchCriteria.cs:75 #, csharp-format msgid "Invalid compare operator for keyword '{0}'" msgstr "Nieprawidłowy operator porównania dla słowa '{0}'" #: src/Searching/VolumeSearchCriteria/EUSLSearchCriteria.cs:99 #: src/Searching/ItemSearchCriteria/EUSLSearchCriteria.cs:122 #, csharp-format msgid "Unknown keyword '{0}'" msgstr "Nieznane słowo '{0}'" #: src/Searching/VolumeSearchCriteria/EUSLSearchCriteria.cs:109 #: src/Searching/ItemSearchCriteria/EUSLSearchCriteria.cs:133 msgid "Invalid compare operator for a keyword that maps to textual content" msgstr "" "Nieprawidłowy operator porównania dla słowa, które wskazuje na zawartość " "tekstową" #: src/Searching/ItemSearchCriteria/EUSLSearchCriteria.cs:85 #, csharp-format msgid "Operand for keyword '{0}' must be a string" msgstr "Argument dla słowa kluczowego '{0}' musi być ciągiem tekstowym" #: src/Searching/ItemSearchCriteria/EUSLSearchCriteria.cs:94 #, csharp-format msgid "Unknown type '{0}'" msgstr "Nieznany typ '{0}'" #: src/Searching/ItemSearchCriteria/EUSLSearchCriteria.cs:100 #, csharp-format msgid "Keyword '{0}' only supports the equality operator ('=')" msgstr "Słowo kluczowe '{0}' wspiera jedynie operator równoważności ('=')" #: src/Searching/AbstractEUSLSearchCriteria.cs:87 #: src/Searching/AbstractEUSLSearchCriteria.cs:91 #, csharp-format msgid "Parsing error: search statement is malformed at position {0}" msgstr "" "Błąd analizy składni: wyszukiwane wyrażenie jest nieprawidłowe na pozycji {0}" #: src/VolumeScanner/AudioCdVolumeScanner.cs:55 msgid "Hashcode generation not implemented for audio cds yet." msgstr "Generowanie hash jest niezaimplementowane jeszcze dla płyt audio." #: src/VolumeScanner/AudioCdVolumeScanner.cs:97 msgid "No MusicBrainz metadata available for this disc." msgstr "Nie znaleziono metadanych MusicBrainz dla tego dysku." #: src/VolumeScanner/AudioCdVolumeScanner.cs:102 msgid "" "The trackcount retrieved from MusicBrainz does not match the trackcount of " "the local disc. Skipped." msgstr "" "Liczba ścieżek pobrana z MusicBrainz nie jest taka sama jak liczba ścieżek " "płyty. Pominięto." #: src/VolumeScanner/AudioCdVolumeScanner.cs:125 msgid "Error connecting to MusicBrainz server." msgstr "Błąd przy połączeniu z serwerem MusicBrainz." #: src/VolumeScanner/FilesystemVolumeScanner.cs:165 #, csharp-format msgid "Directory '{0}' not found. (Wrong filename encoding?)" msgstr "Katalog '{0}' nie znaleziony. (Złe kodowanie nazw?)" #: src/VolumeScanner/FilesystemVolumeScanner.cs:174 #, csharp-format msgid "Skipped item '{0}' as it doesn't seem to be a real directory." msgstr "Pominięto element '{0}', ponieważ nie wygląda na katalog." #: src/VolumeScanner/FilesystemVolumeScanner.cs:195 #: src/VolumeScanner/FilesystemVolumeScanner.cs:340 #, csharp-format msgid "Skipped symlink item '{0}' as the target does not exist." msgstr "Pominięto dowiązanie '{0}', ponieważ jego cel nie istnieje." #: src/VolumeScanner/FilesystemVolumeScanner.cs:204 #: src/VolumeScanner/FilesystemVolumeScanner.cs:347 #, csharp-format msgid "" "Skipped symlink item '{0}' as it appears to point to a different drive " "('{1}')." msgstr "Pominięto dowiązanie '{0}', ponieważ wskazuje na inny dysk ('{1}')." #: src/VolumeScanner/FilesystemVolumeScanner.cs:245 #, csharp-format msgid "File '{0}' not found. (Wrong filename encoding?)" msgstr "Plik '{0}' nie znaleziony. (Złe kodowanie nazw?)" #: src/VolumeScanner/FilesystemVolumeScanner.cs:279 #, csharp-format msgid "Extracting metadata from file '{0}' failed. ({1})" msgstr "" #: src/VolumeScanner/FilesystemVolumeScanner.cs:310 #, csharp-format msgid "Error opening file '{0}', can't retrieve any mime/metadata. ({1})" msgstr "" "Nie udało się otworzyć pliku '{0}', nie udało się pobrać mime/metadanych. " "({1})" #: src/VolumeScanner/FilesystemVolumeScanner.cs:354 #, csharp-format msgid "" "Skipped symlink item '{0}' as it does not point to a regular file ('{1}')." msgstr "" "Pominięto dowiązanie '{0}', ponieważ nie wskazuje na zwykły plik ('{1}')." #: src/VolumeScanner/FilesystemVolumeScanner.cs:363 #, csharp-format msgid "Skipped item '{0}' as it appears to be some kind of special file." msgstr "Pominięty element '{0}' wygląda na rodzaj specjalnego pliku." #: src/VolumeScanner/FilesystemVolumeScanner.cs:381 #, csharp-format msgid "Unable to dump dir '{0}'. ({1})" msgstr "Nie udało się opuścić katalogu '{0}'. ({1})" #: src/VolumeScanner/FilesystemVolumeScanner.cs:500 #, csharp-format msgid "Can't read LastWriteTime from item '{0}' ({1})." msgstr "" "Nie udało się odczytać Czasu Ostatniego Zapisu z elementu '{0}' ({1})." #: src/VolumeScanner/FilesystemVolumeScanner.cs:664 #, csharp-format msgid "Failed to resolve target item for symlink '{0}'." msgstr "Nie udało się pobrać celu z dowiązania '{0}'." VolumeDB/po/sr.resources0000664000175000017500000001414612067326706015426 0ustar patrickpatricklSystem.Resources.ResourceReader, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089#System.Resources.RuntimeResourceSetPADPADP8֞xϴϼƾ_@,ZLxR(I|1 4IY;CKeNNDNcPÇBTUWDXhgCh\qkdqT93 * $q ~hB y ^Can't read LastWriteTime from item '{0}' ({1}).jDirectory '{0}' not found. (Wrong filename encoding?)=NError connecting to MusicBrainz server.Error opening file '{0}', can't retrieve any mime/metadata. ({1})bExtracting metadata from file '{0}' failed. ({1})`Failed to resolve target item for symlink '{0}'.`File '{0}' not found. (Wrong filename encoding?)plHashcode generation not implemented for audio cds yet.Invalid compare operator for a keyword that maps to textual contentaTInvalid compare operator for keyword '{0}'nKeyword '{0}' only supports the equality operator ('=')R`No MusicBrainz metadata available for this disc.Operand for keyword '{0}' must be a number with an optional multiplier&TOperand for keyword '{0}' must be a stringxParsing error: search statement is malformed at position {0}Skipped item '{0}' as it appears to be some kind of special file.kzSkipped item '{0}' as it doesn't seem to be a real directory.Skipped symlink item '{0}' as it appears to point to a different drive ('{1}').n Skipped symlink item '{0}' as it does not point to a regular file ('{1}'). pSkipped symlink item '{0}' as the target does not exist. The trackcount retrieved from MusicBrainz does not match the trackcount of the local disc. Skipped. >Unable to dump dir '{0}'. ({1}) *Unknown keyword '{0}' $Unknown type '{0}'' Project-Id-Version: basenji Report-Msgid-Bugs-To: FULL NAME POT-Creation-Date: 2012-07-15 15:49+0200 PO-Revision-Date: 2012-10-30 14:24+0000 Last-Translator: Мирослав Николић Language-Team: Serbian translators MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Launchpad-Export-Date: 2012-11-18 12:32+0000 X-Generator: Launchpad (build 16278) Language: sr kНе могу да очитам време последњег уписа за ставку „{0}“ ({1}).vНије пронађена фасцикла „{0}“. (Погрешно кодиран назив датотеке?)_Грешка при повезивању са сервером Музичког мозгића.{Грешка отварања датотеке „{0}“, не могу да прибавим метаподатке. ({1})fИзвлачење метаподатка из датотеке „{0}“ није успело. ({1})sНисам успео да решим одредишну ставку за симболичку везу „{0}“.wНије пронађена датотека „{0}“ . (Погрешно кодиран назив датотеке?)vРачунање хеш резултата још увек није омогућено за аудио дискове.Неправилан оператор поређења за кључну реч која се односи на текстуални садржајYНеправилан оператор поређења за кључну реч „{0}“lКључна реч „{0}“ подржава само једнакост („=“) као операторdМузички мозгић нема доступне метаподатке за овај диск.{Операнд кључне речи „{0}“ мора бити број, са опционалним множитељемGОперанд кључне речи „{0}“ мора бити низ}Грешка рашчлањивања: захтев за претрагу је неправилан на положају {0}Ставка „{0}“ је прескочена пошто изгледа као нека врста посебне датотеке.xСтавка „{0}“ је прескочена пошто вероватно није стварна фасцикла.Симболичка веза „{0}“ је прескочена пошто указује на други уређај („{1}“).Симболичка веза „{0}“ је прескочена пошто не указује на исправну датотеку („{1}“).tСимболичка веза „{0}“ је прескочена пошто одредиште не постоји.Број нумера добављен са Музичког мозгића се не подудара са бројем нумера на диску. Прескочено.AНе могу да сажмем фасциклу „{0}“. ({1})0Непозната кључна реч „{0}“'Непозната врста „{0}“VolumeDB/po/cs.resources0000664000175000017500000001171012067326706015401 0ustar patrickpatricklSystem.Resources.ResourceReader, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089#System.Resources.RuntimeResourceSetPADPADP8֞xϴϼƾ_@,ZLxR(I|1 4IY;CKeNNDNcPÇBTUWDXhgCh\qkdqT93 * $q ~hB y ^Can't read LastWriteTime from item '{0}' ({1}).jDirectory '{0}' not found. (Wrong filename encoding?)NError connecting to MusicBrainz server.Error opening file '{0}', can't retrieve any mime/metadata. ({1})HbExtracting metadata from file '{0}' failed. ({1})`Failed to resolve target item for symlink '{0}'.`File '{0}' not found. (Wrong filename encoding?) lHashcode generation not implemented for audio cds yet.PInvalid compare operator for a keyword that maps to textual contentTInvalid compare operator for keyword '{0}'nKeyword '{0}' only supports the equality operator ('=')&`No MusicBrainz metadata available for this disc.kOperand for keyword '{0}' must be a number with an optional multiplierTOperand for keyword '{0}' must be a stringxParsing error: search statement is malformed at position {0}*Skipped item '{0}' as it appears to be some kind of special file.hzSkipped item '{0}' as it doesn't seem to be a real directory.Skipped symlink item '{0}' as it appears to point to a different drive ('{1}').Skipped symlink item '{0}' as it does not point to a regular file ('{1}').[pSkipped symlink item '{0}' as the target does not exist.The trackcount retrieved from MusicBrainz does not match the trackcount of the local disc. Skipped.>Unable to dump dir '{0}'. ({1})S*Unknown keyword '{0}'{$Unknown type '{0}'Project-Id-Version: basenji Report-Msgid-Bugs-To: FULL NAME POT-Creation-Date: 2012-07-15 15:49+0200 PO-Revision-Date: 2011-09-18 16:02+0000 Last-Translator: Konki Language-Team: Czech MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Launchpad-Export-Date: 2012-10-27 11:00+0000 X-Generator: Launchpad (build 16194) 2Nelze číst LastWriteTime z položky '{0}' ({1}).AAdresář '{0}' nenalezen. (Špatné kódování názvu souboru?)0Chyba při připojování k serveru MusicBrainz.QChyba při otvírání souboru '{0}', nelze získat žádná mime/metadata. ({1})0Extrakce metadat ze souboru '{0}' selhala. ({1})=Nepodařilo se vyřešit cílovou položku pro symlink '{0}'.BSoubor '{0}' nebyl nalezen. (Špatné kódování názvu souboru?)?Generace hash kódu není ještě implementována pro audio cd.VNeplatný srovnávací operátor pro klíčové slovo, které mapuje na textový obsah;Neplatný srovnávací operátor pro klíčové slovo '{0}'CKlíčové slovo '{0}' podporuje jen rovnající se operátor ('=')5Pro tento disk nejsou dostupná MusicBrainz metadata.MOperand pro klíčové slovo '{0}' musí být číslo s volitelným násobkem7Operand pro klíčové slovo '{0}' musí být řetězecUnable to dump dir '{0}'. ({1})a*Unknown keyword '{0}'$Unknown type '{0}'Project-Id-Version: basenji Report-Msgid-Bugs-To: FULL NAME POT-Creation-Date: 2012-07-15 15:49+0200 PO-Revision-Date: 2010-05-21 10:47+0000 Last-Translator: Yaron Language-Team: Hebrew MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Launchpad-Export-Date: 2012-10-27 11:00+0000 X-Generator: Launchpad (build 16194) Eלא ניתן לקרוא את LastWriteTime מהפריט '{0}' ({1}).Lהתיקייה '{0}' לא נמצאה. (קידוד שם הקובץ שגוי?)9ארעה שגיאה בחיבור אל שרת MusicBrainz.aשגיאה בפתיחת הקובץ '{0}', לא ניתן לאחזר mime/נתוני־מטא. ({1})Oכשל באיחזור פריט היעד עבור הקישור הסמלי '{0}'.Fהקובץ '{0}' לא נמצא. (קידוד שם הקובץ שגוי?)kהאפשרות ליצירת קוד גיבוב אינה מוטמעת עדיין עבור תקליטורים.lאופרטור ההשוואה שגוי עבור מילות מפתח שממפות לתוכן טקסטואליCאין נתוני מטא זמינים עבור תקליטור זה.Jשגיאת ניתוח: הביטוי לחיפוש שגוי במיקום {0}\הפריט '{0}' נפסח כיוון שנראה כי הוא סוג של קובץ מיוחד.[הפריט '{0}' נפסח כיוון שלא נראה כי הוא תיקייה אמיתית.uפריט הקישור הסמלי '{0}' נפסח כיוון שנראה כי הוא מקשר לכונן אחר ('{1}').kפריט הקישור הסמלי '{0}' נפסח כיוון שאינו מפנה לקובץ רגיל ('{1}').Oהקישור הסמלי '{0}' נפסח כיוון שהמטרה לא קיימת.מספור הרצועות שהתקבל מ־MusicBrainz אינו תואם למספור הרצועות בתקליטור המקומי. מתבצע דילוג.Bלא ניתן לבצע אגירה של התיקייה '{0}'. ({1})-מילת המפתח '{0}' אינה מוכרת!הסוג '{0}' אינו ידועVolumeDB/volumedb.pc.in0000664000175000017500000000016012067326706015165 0ustar patrickpatrickName: VolumeDB Description: VolumeDB Version: 0.1 Requires: Libs: -r:@expanded_libdir@/@PACKAGE@/VolumeDB.dll VolumeDB/src/0000775000175000017500000000000012067326706013211 5ustar patrickpatrickVolumeDB/src/Global.cs0000664000175000017500000000216112067326706014740 0ustar patrickpatrick// Global.cs // // Copyright (C) 2010, 2011 Patrick Ulbrich // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // using System; namespace VolumeDB { // global settings public static class Global { #if DEBUG private static bool enableDebugging = true; #else private static bool enableDebugging = false; #endif public static bool EnableDebugging { get { return enableDebugging; } set { enableDebugging = value; } } public static void EnforceCulture(string name) { S.SetCulture(name); } } } VolumeDB/src/Volume.cs0000664000175000017500000002204312067326706015010 0ustar patrickpatrick// Volume.cs // // Copyright (C) 2008 Patrick Ulbrich // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // using System; //using System.Collections.Generic; // TODO : overwrite ToString() reasonably // TODO : IDiposable to free VolumeDatabase? (if yes, do so in VolumeITEM as well!) // TODO : if this class gets a method in terms of GetFiles(), make sure that it can't be called while the class is filled by a scanner! namespace VolumeDB { public abstract class Volume : VolumeDBDataType { // length constants used by // - client programs to validate user input // - this class to validate _user_ input to _public_ properties // - VolumeDatabase when creating tables public const int MAX_TITLE_LENGTH = 64; public const int MAX_ARCHIVE_NO_LENGTH = 16; public const int MAX_LOANED_TO_LENGTH = 64; public const int MAX_CATEGORY_LENGTH = 64; public const int MAX_DESCRIPTION_LENGTH = 4096; public const int MAX_KEYWORDS_LENGTH = 4096; // table info required by VolumeDBDataType private const string tableName = "Volumes"; private static readonly string[] primarykeyFields = { "VolumeID" }; private long volumeID; private string title; private DateTime added; private bool isHashed; private string archiveNo; private VolumeDriveType driveType; private string loanedTo; private DateTime loanedDate; private DateTime returnDate; private string category; private string description; private string keywords; //private string clientAppData; private VolumeDatabase database; private VolumeType volumeType; internal Volume(VolumeDatabase database, VolumeType volumeType) : base(tableName, primarykeyFields) { this.volumeID = 0L; this.title = null; this.added = DateTime.MinValue; this.isHashed = false; this.archiveNo = null; this.driveType = VolumeDriveType.Unknown; this.loanedTo = null; this.loanedDate = DateTime.MinValue; this.returnDate = DateTime.MinValue; this.category = null; this.description = null; this.keywords = null; //this.clientAppData = null; this.database = database; this.volumeType = volumeType; } /// /// Required by internal factory methods like AbstractVolumeScanner.CreateVolumeObject() /// Purpose : /// /// - guarantee that _all_ fields of this type are initialized by the caller /// (in contrast to property initialization, which easily makes you miss a property [in particular if a new one was added..]) /// /// /// - seperate fields of a type from fields of its base type (e.g. AbstractVolumeScanner.CreateVolumeObject() initializes all fields of a the Volume base type. /// Caller code only needs to initialize fields of the derived Volume type) /// /// internal void SetVolumeFields( long volumeID, string title, DateTime added, bool isHashed, string archiveNo, VolumeDriveType driveType, string loanedTo, DateTime loanedDate, DateTime returnDate, string category, string description, string keywords /*, string clientAppData*/) { this.volumeID = volumeID; this.title = title; this.added = added; this.isHashed = isHashed; this.archiveNo = archiveNo; this.driveType = driveType; this.loanedTo = loanedTo; this.loanedDate = loanedDate; this.returnDate = returnDate; this.category = category; this.description = description; this.keywords = keywords; //this.clientAppData = clientAppData; } public VolumeType GetVolumeType() { return volumeType; } public IContainerItem GetRoot() { return Database.GetVolumeRoot(volumeID); } internal override void ReadFromVolumeDBRecord(IRecordData recordData) { volumeID = (long) recordData["VolumeID"]; title = Util.ReplaceDBNull( recordData["Title"], null); added = Util.ReplaceDBNull( recordData["Added"], DateTime.MinValue); isHashed = (bool) recordData["IsHashed"]; archiveNo = Util.ReplaceDBNull( recordData["ArchiveNr"], null); driveType = (VolumeDriveType)(int)(long) recordData["DriveType"]; loanedTo = Util.ReplaceDBNull( recordData["Loaned_To"], null); loanedDate = Util.ReplaceDBNull( recordData["Loaned_Date"], DateTime.MinValue); returnDate = Util.ReplaceDBNull( recordData["Return_Date"], DateTime.MinValue); category = Util.ReplaceDBNull( recordData["Category"], null); description = Util.ReplaceDBNull( recordData["Description"], null); keywords = Util.ReplaceDBNull( recordData["Keywords"], null); //clientAppData = Util.ReplaceDBNull( recordData["ClientAppData"], null); } internal override void WriteToVolumeDBRecord(IRecordData recordData) { recordData.AddField("VolumeID", volumeID); recordData.AddField("Title", title); recordData.AddField("Added", added); recordData.AddField("VolumeType", volumeType); recordData.AddField("IsHashed", isHashed); recordData.AddField("ArchiveNr", archiveNo); recordData.AddField("DriveType", driveType); recordData.AddField("Loaned_To", loanedTo); recordData.AddField("Loaned_Date", loanedDate); recordData.AddField("Return_Date", returnDate); recordData.AddField("Category", category); recordData.AddField("Description", description); recordData.AddField("Keywords", keywords); //recordData.AddField("ClientAppData", clientAppData); } internal override void InsertIntoDB() { Database.InsertVolume(this); } public override void UpdateChanges() { Database.UpdateVolume(this); } internal static Volume CreateInstance(VolumeType type, VolumeDatabase database) { Volume volume = null; switch (type) { case VolumeType.FileSystemVolume: volume = new FileSystemVolume(database); break; case VolumeType.AudioCdVolume: volume = new AudioCdVolume(database); break; default: throw new NotImplementedException(string.Format("Instanciation of type {0} is not implemented", type.ToString())); } return volume; } #region read-only properties public long VolumeID { get { return volumeID; } internal set { volumeID = value; } } public DateTime Added { get { return added; } internal set { added = value; } } public bool IsHashed { get { return isHashed; } internal set { isHashed = value; } } #endregion #region editable properties /* it's not always possible to retrieve a title from a volume, * some volumes don't even have a name (especially on linux). * allow the user to specify the title manually. */ public string Title { get { return title ?? string.Empty; } set { EnsurePropertyLength(value, MAX_TITLE_LENGTH); title = value; } } public string ArchiveNo { get { return archiveNo ?? string.Empty; } set { EnsurePropertyLength(value, MAX_ARCHIVE_NO_LENGTH); archiveNo = value; } } public VolumeDriveType DriveType { get { return driveType; } set { driveType = value; } } public string LoanedTo { get { return loanedTo ?? string.Empty; } set { EnsurePropertyLength(value, MAX_LOANED_TO_LENGTH); loanedTo = value; } } public DateTime LoanedDate { get { return loanedDate; } set { loanedDate = value; } } public DateTime ReturnDate { get { return returnDate; } set { returnDate = value; } } public string Category { get { return category ?? string.Empty; } set { EnsurePropertyLength(value, MAX_CATEGORY_LENGTH); category = value; } } public string Description { get { return description ?? string.Empty; } set { EnsurePropertyLength(value, MAX_DESCRIPTION_LENGTH); description = value; } } public string Keywords { get { return keywords ?? string.Empty; } set { EnsurePropertyLength(value, MAX_KEYWORDS_LENGTH); keywords = value; } } // /// // ///Data a client application (app that is using this library) can attach to a Volume object. // /// // public string ClientAppData { // get { return clientAppData ?? string.Empty; } // set { clientAppData = value; } // } #endregion public override string ToString() { return Title; } protected VolumeDatabase Database { get { if (database == null) throw new InvalidOperationException("No database associated"); return database; } } } } VolumeDB/src/DirectoryVolumeItem.cs0000664000175000017500000000517412067326706017522 0ustar patrickpatrick// DirectoryVolumeItem.cs // // Copyright (C) 2008 Patrick Ulbrich // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // using System; namespace VolumeDB { public sealed class DirectoryVolumeItem : FileSystemVolumeItem, IContainerItem { internal DirectoryVolumeItem(VolumeDatabase database) : base(database, VolumeItemType.DirectoryVolumeItem) { } #region IContainerItem Members IChildItem[] IContainerItem.GetItems() { // TODO: // return null or 0-length-array if no entry exists? (does GetChildItems() has to take this into account?) // how does DirectoryInfo.GetDirctories() behave in this regard? return Database.GetChildItems(VolumeID, IsSymLink ? SymLinkTargetID : ItemID); } IContainerItem[] IContainerItem.GetContainers() { // TODO: // return null or 0-length-array if no entry exists? (does GetChildContainerItems() has to take this into account?) // how does DirectoryInfo.GetDirctories() behave in this regard? return Database.GetChildContainerItems(VolumeID, IsSymLink ? SymLinkTargetID : ItemID); } #endregion // DirectoryVolumeItem specific implementation of IChildItem.GetParent() public DirectoryVolumeItem GetParent() { return (DirectoryVolumeItem) ((IChildItem)this).GetParent(); } // DirectoryVolumeItem specific implementation of IContainerItem.GetContainers() public DirectoryVolumeItem[] GetDirectories() { //return (DirectoryVolumeItem[]) ((IContainerItem)this).GetContainers(); return Database.GetChildContainerItems(VolumeID, IsSymLink ? SymLinkTargetID : ItemID); } // DirectoryVolumeItem specific implementation of IContainerItem.GetItems() public FileVolumeItem[] GetFiles() { //return (FileVolumeItem[]) ((IContainerItem)this).GetItems(); return Database.GetChildItems(VolumeID, IsSymLink ? SymLinkTargetID : ItemID); } internal override void WriteToVolumeDBRecord(IRecordData recordData) { base.WriteToVolumeDBRecord(recordData); recordData.AddField("IsContainer", true); } } } VolumeDB/src/VolumeType.cs0000664000175000017500000000147612067326706015661 0ustar patrickpatrick// VolumeType.cs // // Copyright (C) 2008, 2010 Patrick Ulbrich // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // using System; namespace VolumeDB { public enum VolumeType { FileSystemVolume = 0, AudioCdVolume = 1 } } VolumeDB/src/IChildItem.cs0000664000175000017500000000242612067326706015517 0ustar patrickpatrick// IChildItem.cs // // Copyright (C) 2008 Patrick Ulbrich // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // using System; namespace VolumeDB { /* interface for abstract hierarchical parent/child item access * * should be implemented explicitely since * a) it is not meant to be called on a VolumeItem directly * (rather via "entry" methods like Volume.GetRootItem()) * b) specific VolumeItem implementations implement less abstract members * (i.e. alias-methods with a more specific/meaningful name) * that map to members of this interface. */ public interface IChildItem { IContainerItem GetParent(); string Name { get; } VolumeItemType GetVolumeItemType(); } } VolumeDB/src/VolumeDriveType.cs0000664000175000017500000000156212067326706016647 0ustar patrickpatrick// VolumeDriveType.cs // // Copyright (C) 2008 Patrick Ulbrich // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // using System; namespace VolumeDB { public enum VolumeDriveType { Unknown = 0, Removable = 1, Harddisk = 2, Network = 3, CDRom = 4, Ram = 5 } } VolumeDB/src/Util.cs0000664000175000017500000000334212067326706014457 0ustar patrickpatrick// Util.cs // // Copyright (C) 2008 Patrick Ulbrich // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // using System; namespace VolumeDB { internal static class Util { /* /// /// Checks wheter an array holds null references only /// /// the array to be checked /// returns true if the array contains one ore more non-null elements, otherweise false public static bool IsNullArray(System.Array arr) { bool r = true; foreach(object o in arr) { if (o != null) { r = false; break; } } return r; } */ /// /// Checks wheter an array holds null references only /// /// the array to be checked /// returns true if the array contains one ore more non-null elements, otherweise false public static bool IsNullArray(T[] arr) { return Array.TrueForAll(arr, delegate(T val) { return val == null; } ); } public static T ReplaceDBNull(object dbValue, T replaceValue) { return dbValue == DBNull.Value ? replaceValue : (T)dbValue; } } } VolumeDB/src/Searching/0000775000175000017500000000000012067326706015114 5ustar patrickpatrickVolumeDB/src/Searching/ExcludedSearchCriteria.cs0000664000175000017500000000255512067326706022020 0ustar patrickpatrick// ExcludedSearchCriteria.cs // // Copyright (C) 2009 Patrick Ulbrich // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // using System; namespace VolumeDB.Searching { public sealed class ExcludedSearchCriteria : ISearchCriteria { private ISearchCriteria searchCriteria; public ExcludedSearchCriteria(ISearchCriteria searchCriteria) { if (searchCriteria == null) throw new ArgumentNullException("searchCriteria"); this.searchCriteria = searchCriteria; } #region ISearchCriteria Members string ISearchCriteria.GetSqlSearchCondition() { return string.Format("NOT ({0})", searchCriteria.GetSqlSearchCondition()); } SearchCriteriaType ISearchCriteria.SearchCriteriaType { get { return searchCriteria.SearchCriteriaType; } } #endregion } } VolumeDB/src/Searching/EUSL/0000775000175000017500000000000012067326706015664 5ustar patrickpatrickVolumeDB/src/Searching/EUSL/Scanning/0000775000175000017500000000000012067326706017424 5ustar patrickpatrickVolumeDB/src/Searching/EUSL/Scanning/TokenKind.cs0000664000175000017500000000215612067326706021645 0ustar patrickpatrick// TokenKind.cs // // Copyright (C) 2009 Patrick Ulbrich // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // using System; namespace VolumeDB.Searching.EUSL.Scanning { internal enum TokenKind { MINUS, PLUS, WORD_OR_KEYWORD, /* a word is interpreted as a keyword by the parser if it is followed by a relation operator */ PHRASE, NUMBER, COLLECT_AND, COLLECT_OR, RELATION_LESS, RELATION_LESS_OR_EQUAL, RELATION_GREATER, RELATION_GREATER_OR_EQUAL, RELATION_EQUAL, RELATION_CONTAINS, EOF, UNKNOWN } } VolumeDB/src/Searching/EUSL/Scanning/Token.cs0000664000175000017500000000216212067326706021034 0ustar patrickpatrick// Token.cs // // Copyright (C) 2009 Patrick Ulbrich // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // using System; namespace VolumeDB.Searching.EUSL.Scanning { internal class Token { public TokenKind kind; public String text; public long value; public int pos; public Token() { Reset(); } public void Reset() { this.kind = TokenKind.EOF; this.text = string.Empty; this.value = -1L; this.pos = -1; } public override string ToString () { return kind.ToString(); } } } VolumeDB/src/Searching/EUSL/Scanning/ScannerException.cs0000664000175000017500000000170712067326706023230 0ustar patrickpatrick// ScannerException.cs // // Copyright (C) 2009 Patrick Ulbrich // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // using System; namespace VolumeDB.Searching.EUSL.Scanning { internal class ScannerException : Exception { public ScannerException(string msg, int pos) : base(msg) { this.Pos = pos; } public int Pos { get; private set; } } } VolumeDB/src/Searching/EUSL/Scanning/Scanner.cs0000664000175000017500000003626412067326706021357 0ustar patrickpatrick// Scanner.cs // // Copyright (C) 2009 Patrick Ulbrich // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // // TODO : currently all whitespace is ignored. // it should possibly be returned as a token (tokendkind.whitespace) // and compared against the grammer by the parser. using System; using System.Text; namespace VolumeDB.Searching.EUSL.Scanning { // scanner that analyzes the given text in volumedatabe search language format // and segments it into tokens internal class Scanner { private const char CHAR_EOF = char.MinValue; // signals EOF private string text; private Token currentToken; private Token lookAheadToken; private int currentPos; private char currentChar; private StringBuilder wordBuf; /// /// Constructor that initializes the scanner with the given Text. /// The first token can be accessed through the CurrentToken property, /// the following token through the LookAheadToken property. /// Throws ScannerException. /// /// /// A /// public Scanner(string text) { if (text == null) throw new ArgumentNullException("text"); wordBuf = new StringBuilder(); currentToken = new Token(); lookAheadToken = new Token(); Reset(text); } /// /// Default constructor. /// Throws ScannerException. /// public Scanner() : this(string.Empty) {} public string Text { get { return text; } set { Reset(value); } } public Token CurrentToken { get { return currentToken; } } public Token LookAheadToken { get { return lookAheadToken; } } public void ReadNextToken() { Token tmpToken = currentToken; currentToken = lookAheadToken; lookAheadToken = tmpToken; lookAheadToken.Reset(); Scan(); SkipWhiteSpace(); } private void ReadNextChar() { if (currentPos < (text.Length - 1)) { currentPos++; currentChar = text[currentPos]; } else { currentPos = text.Length; currentChar = CHAR_EOF; } } private void Scan() { // token can be one of these: // MINUS, PLUS, WORD_OR_KEYWORD, PHRASE, NUMBER, // COLLECT (&&, ||, and, AND, or, OR), RELATION lookAheadToken.pos = currentPos; // evaluate start char switch (currentChar) { case CHAR_EOF: lookAheadToken.kind = TokenKind.EOF; break; case '-': lookAheadToken.kind = TokenKind.MINUS; ReadNextChar(); break; case '+': lookAheadToken.kind = TokenKind.PLUS; ReadNextChar(); break; case '"': ScanPhrase(); break; case '&': ReadNextChar(); if (currentChar == '&') { lookAheadToken.kind = TokenKind.COLLECT_AND; ReadNextChar(); } else { lookAheadToken.kind = TokenKind.UNKNOWN; } break; case '|': ReadNextChar(); if (currentChar == '|') { lookAheadToken.kind = TokenKind.COLLECT_OR; ReadNextChar(); } else { lookAheadToken.kind = TokenKind.UNKNOWN; } break; case '<': ReadNextChar(); if (currentChar == '=') { lookAheadToken.kind = TokenKind.RELATION_LESS_OR_EQUAL; ReadNextChar(); } else { lookAheadToken.kind = TokenKind.RELATION_LESS; } break; case '>': ReadNextChar(); if (currentChar == '=') { lookAheadToken.kind = TokenKind.RELATION_GREATER_OR_EQUAL; ReadNextChar(); } else { lookAheadToken.kind = TokenKind.RELATION_GREATER; } break; case '=': lookAheadToken.kind = TokenKind.RELATION_EQUAL; ReadNextChar(); break; case ':': lookAheadToken.kind = TokenKind.RELATION_CONTAINS; ReadNextChar(); break; default: if (IsValidTokenAutomatChar(currentChar)) { TokenAutomat(); } else { lookAheadToken.kind = TokenKind.UNKNOWN; ReadNextChar(); } break; } } private void ScanPhrase() { wordBuf.Length = 0; // reset stringbuilder ReadNextChar(); // consume phrase start delimeter while (currentChar != '"' && currentChar != CHAR_EOF) { wordBuf.Append(currentChar); ReadNextChar(); } if (currentChar == CHAR_EOF) { throw new ScannerException("Phrase it not terminated (EOF)", currentPos); } else { ReadNextChar(); // consume phrase end delimeter } lookAheadToken.kind = TokenKind.PHRASE; lookAheadToken.text = wordBuf.ToString(); } /* token automat states * * (Start) * | * +--'A'------------------------------------------------------------------------------------------------->(A)-'N'->(AN)-'D'->(AND) * | | | | * +--'a'--------------------------------------------------------------------->(a)-'n'->(an)-'d'->(and) | | | * | | | | | | | * +--'O'--------------------------------------------------->(O)-'R'->(OR) | | | | | | * | | | | | | | | | * +--'o'--------------------------------->(o)-'r'->(or) | | | | | | | | * | | | | | | | | | | | * +--Digit---------------->(Number) | | | | | | | | | | * | | | | | | | | | | | | * | ^ | | | | | | | | | | | * | | | | | | | | | | | | | * | +Digit+ | | | | | | | | | | * | | | | | | | | | | | | * | +->(End) | +->(End) | +->(End) | | +->(End) | | +->(End) * | | | | | | | | | | | | * | C | C | C | | C | | C * | | | | | | | | | | | | * | v v v v v v v v v v v * | * +--C \ { A, a, O, o, Digit }-->( Word or Keyword ) +-> (End) * | * ^ | * |________________________C________________________| * * C := { valid automat chars } (see IsValidAutomatChar()) */ private const uint INCOMPLETE_STATE = (1 << 1); private enum ScanState : uint { Start = (1 << 2), A = (1 << 3) | INCOMPLETE_STATE, AN = (1 << 4) | INCOMPLETE_STATE, AND = (1 << 5), a = (1 << 6) | INCOMPLETE_STATE, an = (1 << 7) | INCOMPLETE_STATE, and = (1 << 8), O = (1 << 9) | INCOMPLETE_STATE, OR = (1 << 10), o = (1 << 11) | INCOMPLETE_STATE, or = (1 << 12), Number = (1 << 13), Word_Or_Keyword = (1 << 14) } private void TokenAutomat() { // token can be one of these (MINUS, PLUS, PHRASE and RELATION have been filtered out in Scan()): // WORD_OR_KEYWORD, NUMBER, COLLECT (and, AND, or, OR) long num = 0; wordBuf.Length = 0; // reset stringbuilder ScanState state = ScanState.Start; // run automat while (IsValidTokenAutomatChar(currentChar)) { switch (state) { case ScanState.Start: switch (currentChar) { case 'A': state = ScanState.A; break; case 'a': state = ScanState.a; break; case 'O': state = ScanState.O; break; case 'o': state = ScanState.o; break; default: if (char.IsDigit(currentChar)) { AppendDigit(ref num, currentChar); state = ScanState.Number; } else { wordBuf.Append(currentChar); state = ScanState.Word_Or_Keyword; } break; } break; case ScanState.A: if (currentChar == 'N') { state = ScanState.AN; } else { wordBuf.Append('A').Append(currentChar); state = ScanState.Word_Or_Keyword; } break; case ScanState.AN: if (currentChar == 'D') { state = ScanState.AND; } else { wordBuf.Append("AN").Append(currentChar); state = ScanState.Word_Or_Keyword; } break; case ScanState.AND: wordBuf.Append("AND").Append(currentChar); state = ScanState.Word_Or_Keyword; break; case ScanState.O: if (currentChar == 'R') { state = ScanState.OR; } else { wordBuf.Append('O').Append(currentChar); state = ScanState.Word_Or_Keyword; } break; case ScanState.OR: wordBuf.Append("OR").Append(currentChar); state = ScanState.Word_Or_Keyword; break; case ScanState.a: if (currentChar == 'n') { state = ScanState.an; } else { wordBuf.Append('a').Append(currentChar); state = ScanState.Word_Or_Keyword; } break; case ScanState.an: if (currentChar == 'd') { state = ScanState.and; } else { wordBuf.Append("an").Append(currentChar); state = ScanState.Word_Or_Keyword; } break; case ScanState.and: wordBuf.Append("and").Append(currentChar); state = ScanState.Word_Or_Keyword; break; case ScanState.o: if (currentChar == 'r') { state = ScanState.or; } else { wordBuf.Append('o').Append(currentChar); state = ScanState.Word_Or_Keyword; } break; case ScanState.or: wordBuf.Append("or").Append(currentChar); state = ScanState.Word_Or_Keyword; break; case ScanState.Number: if (char.IsNumber(currentChar)) { AppendDigit(ref num, currentChar); } else { // e.g. 10a, 10b, 0x10, 10.2mb wordBuf.Append(num).Append(currentChar); state = ScanState.Word_Or_Keyword; } break; case ScanState.Word_Or_Keyword: wordBuf.Append(currentChar); break; } ReadNextChar(); } // evaluate automat state and set token switch (state) { case ScanState.AND: case ScanState.and: lookAheadToken.kind = TokenKind.COLLECT_AND; break; case ScanState.OR: case ScanState.or: lookAheadToken.kind = TokenKind.COLLECT_OR; break; case ScanState.Number: lookAheadToken.kind = TokenKind.NUMBER; lookAheadToken.value = num; break; default: lookAheadToken.kind = TokenKind.WORD_OR_KEYWORD; if (((uint)state & INCOMPLETE_STATE) == INCOMPLETE_STATE) { // set word text of incomplete states (A, AN, a, an, O, o) lookAheadToken.text = state.ToString(); // reflection magic } else { lookAheadToken.text = wordBuf.ToString(); } break; } } // Note: // when changing this condition make sure the following chars are EXCLUDED: // - CHAR_EOF // - whitespace (e.g. space, tab, CR, LF) // - '<', '>', '=', ':' (in contrast to +/- and collect, // relations are not required to be prefixed by whitespace.) // // '.' should be allowed in any case since users often search for something like picture.jpg // '-' and '_' may be identified as whitespace instead (e.g. in SkipWhiteSpace()), like google does. // // Also don't forget to adjust the the automat sketch and the grammer sktetch in Parser.cs. private static bool IsValidTokenAutomatChar(char c) { return !( c == CHAR_EOF || char.IsWhiteSpace(c) || c == '<' || c == '>' || c == '=' || c == ':'); /* return char.IsLetterOrDigit(c) || c == '.' || c == ',' || c == '&' || c == '_' || c == '-' || c == '+' || c == '#' || c == '%' || c == '~' || c == '$' || c == '\'' || c == '\"' || c == '!' || c == '?'; */ } private void AppendDigit(ref long num, char c) { long n = num; num *= 10; num += (long)(c - '0'); if (num < n) { // overflow detected. // a number token can't be passed to the exception // since the number could have become a word token // in a later state as well. // so just pass the scanner position instead. throw new ScannerException("Number is too big", currentPos); } } private void SkipWhiteSpace() { while (char.IsWhiteSpace(currentChar)) { ReadNextChar(); } } private void Reset(string text) { this.text = text; currentToken.Reset(); lookAheadToken.Reset(); currentPos = -1; currentChar = CHAR_EOF; ReadNextChar(); // init currentChar SkipWhiteSpace(); // skip possible whitespace in the beginning ReadNextToken(); // init lookahead token ReadNextToken(); // init first token } } } VolumeDB/src/Searching/EUSL/Parsing/0000775000175000017500000000000012067326706017267 5ustar patrickpatrickVolumeDB/src/Searching/EUSL/Parsing/TermType.cs0000664000175000017500000000150612067326706021371 0ustar patrickpatrick// TermType.cs // // Copyright (C) 2009 Patrick Ulbrich // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // using System; namespace VolumeDB.Searching.EUSL.Parsing { internal enum TermType { Word, Phrase, Number, Select } } VolumeDB/src/Searching/EUSL/Parsing/EventHandlers.cs0000664000175000017500000000556112067326706022367 0ustar patrickpatrick// EventHandlers.cs // // Copyright (C) 2009 Patrick Ulbrich // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // using System; using VolumeDB.Searching.EUSL.Scanning; namespace VolumeDB.Searching.EUSL.Parsing { internal delegate void TermParsedEventHandler(object sender, TermParsedEventArgs e); internal delegate void CollectParsedEventHandler(object sender, CollectParsedEventArgs e); internal class TermParsedEventArgs : EventArgs { private TermType termType; private string word; private string phrase; private long number; private string keyword; private Relation relation; private bool excludeTerm; public TermParsedEventArgs( TermType tt, string word, string phrase, long number, string keyword, Relation r, bool exclude ) { this.termType = tt; this.word = word; this.phrase = phrase; this.number = number; this.keyword = keyword; this.relation = r; this.excludeTerm = exclude; } public TermType TermType { get { return termType; } } public string Word { get { if (TermType != TermType.Word && TermType != TermType.Select) RaiseInvalidPropertyException(); return word; } } public string Phrase { get { if (TermType != TermType.Phrase && TermType != TermType.Select) RaiseInvalidPropertyException(); return phrase; } } public long Number { get { if (TermType != TermType.Number && TermType != TermType.Select) RaiseInvalidPropertyException(); return number; } } public string Keyword { get { if (TermType != TermType.Select) RaiseInvalidPropertyException(); return keyword; } } public Relation Relation { get { if (TermType != TermType.Select) RaiseInvalidPropertyException(); return relation; } } public bool ExcludeTerm { get { return excludeTerm; } } private void RaiseInvalidPropertyException() { throw new InvalidOperationException( "This property is invalid for the current termtype"); } } internal class CollectParsedEventArgs : EventArgs { public CollectParsedEventArgs(Collect c) : base() { this.Collect = c; } public Collect Collect { get; private set; } } } VolumeDB/src/Searching/EUSL/Parsing/Relation.cs0000664000175000017500000000156112067326706021376 0ustar patrickpatrick// Relation.cs // // Copyright (C) 2009 Patrick Ulbrich // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // using System; namespace VolumeDB.Searching.EUSL.Parsing { internal enum Relation { None, Less, LessOrEqual, Greater, GreaterOrEqual, Equal, Contains } } VolumeDB/src/Searching/EUSL/Parsing/Collect.cs0000664000175000017500000000146412067326706021210 0ustar patrickpatrick// Collect.cs // // Copyright (C) 2009 Patrick Ulbrich // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // using System; namespace VolumeDB.Searching.EUSL.Parsing { internal enum Collect { None, And, Or } } VolumeDB/src/Searching/EUSL/Parsing/UnexpectedTokenException.cs0000664000175000017500000000315612067326706024607 0ustar patrickpatrick// UnexpectedTokenException.cs // // Copyright (C) 2009 Patrick Ulbrich // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // using System; using VolumeDB.Searching.EUSL.Scanning; namespace VolumeDB.Searching.EUSL.Parsing { internal class UnexpectedTokenException : Exception { public UnexpectedTokenException( string msg, Token t, params TokenKind[] expectedTokenKinds) : base(msg) { Token = t; ExpectedTokenKinds = expectedTokenKinds; } public Token Token { get; private set; } public TokenKind[] ExpectedTokenKinds { get; private set; } /* public override string Message { get { StringBuilder sb = new StringBuilder(); for (int i = 0; i < ExpectedTokenKinds.Length; i++) { if (i > 0) sb.Append(" or "); sb.Append(ExpectedTokenKinds[i].ToString()); } return string.Format("Expected a {0} ({1}) at position {2} but found {3}", ExpectedTerminalOrNonTerminal, sb.ToString(), Token.pos, Token.kind); } }*/ } } VolumeDB/src/Searching/EUSL/Parsing/Parser.cs0000664000175000017500000002372312067326706021061 0ustar patrickpatrick// Parser.cs // // Copyright (C) 2009 Patrick Ulbrich // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // /* End User Search Language (EUSL) Slightly modified xesam end user search language, see http://xesam.org/main/XesamUserSearchLanguage, http://grillbar.org/xesam/end-user-sl.old.png Modifications: * whitespace between [+|-] and Term allowed * Number introduced * no modifier support * Select Term uses custom keywords instead of xesam keywords Notes: * Collect is optional, default is AND * + is ignored, - means NOT Grammer in EBNF (http://www.w3.org/TR/2004/REC-xml-20040204/#sec-notation): Search_Statement ::= (['+'|'-'] [WS] Term ([WS Collect] WS ['+'|'-'] [WS] Term)* Term ::= Select | Phrase | Word | Number Select ::= Keyword [WS] Relation [WS] (Word | Phrase | Number) Phrase ::= '"' String '"' Collect ::= 'AND' | 'OR' | 'and' | 'or' | '&&' | '||' Keyword ::= Any Word that is recognized as a keyword and mapped to searchfields by a client app (e.g. by volumedb) Relation ::= '<' | '>' | '=' | '<=' | '>=' | ':' WS ::= (#x20 | #x09 | #x0D | #x0A)+ Word ::= Any unicode character sequence that does not start with any terminal used by this grammer and does not include WS and Relation terminals ('<', '>', '=', ':'). String ::= Any unicode character sequence (inclusive whitespace). Number ::= ('0' | '1' | '2' | '3' | '4' | '5' | '6' | '7' | '8' | '9')+ */ using System; using System.Text; using VolumeDB.Searching.EUSL.Scanning; namespace VolumeDB.Searching.EUSL.Parsing { internal class Parser { private const long NUMBER_NONE = -1L; private Scanner scanner; private ParsedData parsedData; public Parser() { scanner = new Scanner(); parsedData = new ParsedData(); } /// /// Parses the given Text and raises /// TermParsed and CollectParsed events /// where appropriate. /// Throws UnexpectedTokenException and ScannerException. /// /// /// A /// public void Parse(string text) { Init(text); ParseStatement(); } private void ParseStatement() { // Search_Statement ::= (['+'|'-'] [WS] Term ([WS Collect] WS ['+'|'-'] [WS] Term)* if (scanner.CurrentToken.kind == TokenKind.MINUS) { parsedData.excludeTerm = true; scanner.ReadNextToken(); } else if (scanner.CurrentToken.kind == TokenKind.PLUS) { scanner.ReadNextToken(); } ParseTerm(); while (scanner.CurrentToken.kind != TokenKind.EOF) { if (scanner.CurrentToken.kind == TokenKind.COLLECT_AND || scanner.CurrentToken.kind == TokenKind.COLLECT_OR) { ParseCollect(); } parsedData.excludeTerm = false; if (scanner.CurrentToken.kind == TokenKind.MINUS) { parsedData.excludeTerm = true; scanner.ReadNextToken(); } else if (scanner.CurrentToken.kind == TokenKind.PLUS) { scanner.ReadNextToken(); } ParseTerm(); } } private void ParseTerm() { // Term ::= Select | Phrase | Word | Number switch (scanner.CurrentToken.kind) { case TokenKind.WORD_OR_KEYWORD: switch (scanner.LookAheadToken.kind) { case TokenKind.RELATION_CONTAINS: case TokenKind.RELATION_EQUAL: case TokenKind.RELATION_GREATER: case TokenKind.RELATION_GREATER_OR_EQUAL: case TokenKind.RELATION_LESS: case TokenKind.RELATION_LESS_OR_EQUAL: // interpret current word as keyword ParseSelect(); break; default: ParseWord(false); break; } break; case TokenKind.PHRASE: ParsePhrase(false); break; case TokenKind.NUMBER: ParseNumber(false); break; default: RaiseUnexpectedTokenException( TokenKind.WORD_OR_KEYWORD, TokenKind.PHRASE, TokenKind.NUMBER); break; } } private void ParseSelect() { // Select ::= Keyword [WS] Relation [WS] (Word | Phrase | Number) ParseKeyword(); ParseRelation(); string word = null; string phrase = null; long number = NUMBER_NONE; switch(scanner.CurrentToken.kind) { case TokenKind.WORD_OR_KEYWORD: ParseWord(true); word = parsedData.word; break; case TokenKind.PHRASE: ParsePhrase(true); phrase = parsedData.phrase; break; case TokenKind.NUMBER: ParseNumber(true); number = parsedData.number; break; default: RaiseUnexpectedTokenException( TokenKind.WORD_OR_KEYWORD, TokenKind.PHRASE, TokenKind.NUMBER); break; } OnTermParsed( TermType.Select, word, phrase, number, parsedData.keyword, parsedData.relation, parsedData.excludeTerm); } private void ParsePhrase(bool suppressEvent) { // Phrase := '"' String '"' parsedData.phrase = scanner.CurrentToken.text; if (!suppressEvent) { OnTermParsed( TermType.Phrase, null, parsedData.phrase, NUMBER_NONE, null, Relation.None, parsedData.excludeTerm); } scanner.ReadNextToken(); } private void ParseWord(bool suppressEvent) { // Word ::= Any unicode character sequence that does not start with any terminal used by the grammer // and does not include WS and Relation terminals ('<', '>', '=', ':'). parsedData.word = scanner.CurrentToken.text; if (!suppressEvent) { OnTermParsed( TermType.Word, parsedData.word, null, NUMBER_NONE, null, Relation.None, parsedData.excludeTerm); } scanner.ReadNextToken(); } private void ParseNumber(bool suppressEvent) { // Number ::= ('0' | '1' | '2' | '3' | '4' | '5' | '6' | '7' | '8' | '9')+ parsedData.number = scanner.CurrentToken.value; if (!suppressEvent) { OnTermParsed( TermType.Number, null, null, parsedData.number, null, Relation.None, parsedData.excludeTerm); } scanner.ReadNextToken(); } private void ParseCollect() { // Collect ::= 'AND' | 'OR' | 'and' | 'or' | '&&' | '||' if (scanner.CurrentToken.kind == TokenKind.COLLECT_AND) { parsedData.collect = Collect.And; OnCollectParsed(parsedData.collect); } else { parsedData.collect = Collect.Or; OnCollectParsed(parsedData.collect); } scanner.ReadNextToken(); } private void ParseKeyword() { // Keyword ::= Any Word that is recognized as a keyword // and mapped to searchfields by a client app (e.g. by volumedb) //try { // parsedData.searchField = SearchField.FromString(scanner.CurrentToken.text); //} catch (ArgumentException) { // throw new UnknownSearchFieldException( "Unknown SearchField", // scanner.CurrentToken.text); //} parsedData.keyword = scanner.CurrentToken.text; scanner.ReadNextToken(); } private void ParseRelation() { // Relation ::= '<' | '>' | '=' | '<=' | '>=' | ':' Relation rel = Relation.None; switch (scanner.CurrentToken.kind) { case TokenKind.RELATION_CONTAINS: rel = Relation.Contains; break; case TokenKind.RELATION_EQUAL: rel = Relation.Equal; break; case TokenKind.RELATION_GREATER: rel = Relation.Greater; break; case TokenKind.RELATION_GREATER_OR_EQUAL: rel = Relation.GreaterOrEqual; break; case TokenKind.RELATION_LESS: rel = Relation.Less; break; case TokenKind.RELATION_LESS_OR_EQUAL: rel = Relation.LessOrEqual; break; } parsedData.relation = rel; scanner.ReadNextToken(); } private void RaiseUnexpectedTokenException(params TokenKind[] expectedTokenKinds) { Token t = scanner.CurrentToken; StringBuilder sb = new StringBuilder(); for (int i = 0; i < expectedTokenKinds.Length; i++) { if (i > 0) sb.Append(" or "); sb.Append(expectedTokenKinds[i].ToString()); } string msg = string.Format("Expected {0} at position {1} but found {2}", sb.ToString(), t.pos, t.kind); throw new UnexpectedTokenException( msg, t, expectedTokenKinds); } private void Init(string text) { parsedData.Reset(); scanner.Text = text; } public event TermParsedEventHandler TermParsed; public event CollectParsedEventHandler CollectParsed; protected virtual void OnTermParsed(TermType tt, string word, string phrase, long number, string keyword, Relation r, bool exclude) { if (TermParsed != null) TermParsed(this, new TermParsedEventArgs(tt, word, phrase, number, keyword, r, exclude)); } protected virtual void OnCollectParsed(Collect c) { if (CollectParsed != null) CollectParsed(this, new CollectParsedEventArgs(c)); } private class ParsedData { public bool excludeTerm; public string word; public string phrase; public long number; public string keyword; public Relation relation; public Collect collect; public ParsedData() { Reset(); } public void Reset() { excludeTerm = false; word = null; phrase = null; number = NUMBER_NONE; keyword = null; relation = Relation.None; collect = Collect.None; } } } } VolumeDB/src/Searching/SearchCriteriaType.cs0000664000175000017500000000157212067326706021202 0ustar patrickpatrick// SearchCriteriaType.cs // // Copyright (C) 2009 Patrick Ulbrich // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // using System; namespace VolumeDB.Searching { public enum SearchCriteriaType { None = 0, VolumeSearchCriteria = (1 << 1), ItemSearchCriteria = (1 << 2) } } VolumeDB/src/Searching/ISearchCriteria.cs0000664000175000017500000000232412067326706020445 0ustar patrickpatrick// ISearchCriteria.cs // // Copyright (C) 2008 Patrick Ulbrich // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // using System; namespace VolumeDB.Searching { // implement this one explicitely, // to hide members GetSqlSearchCondition() and SearchCriteriaType. public interface ISearchCriteria { /* * conventions: * - returned string must not be null or 0-length * - returned string is only a part of the WHERE clause * - returned string must prefix columns with the tablename (e.g. "(table.a = 1 AND table.b = 2)" ) */ string GetSqlSearchCondition(); SearchCriteriaType SearchCriteriaType { get; } } } VolumeDB/src/Searching/IFreeTextSearchField.cs0000664000175000017500000000220712067326706021375 0ustar patrickpatrick// IFreeTextSearchField.cs // // Copyright (C) 2009 Patrick Ulbrich // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // using System; namespace VolumeDB.Searching { // implement this one explicitely, // to hide members GetSqlSearchCondition(), SearchCriteriaType and IsEmpty. public interface IFreeTextSearchField { string GetSqlSearchCondition( string searchString, TextCompareOperator compareOperator, MatchRule fieldMatchRule); SearchCriteriaType ResultingSearchCriteriaType { get; } bool IsEmpty { get; } } } VolumeDB/src/Searching/TextCompareOperator.cs0000664000175000017500000000475512067326706021425 0ustar patrickpatrick// TextCompareOperator.cs // // Copyright (C) 2008 Patrick Ulbrich // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // using System; namespace VolumeDB.Searching { public struct TextCompareOperator { private int value; private TextCompareOperator(int value) { this.value = value; } public static TextCompareOperator BeginsWith { get { return new TextCompareOperator(0); }} public static TextCompareOperator Contains { get { return new TextCompareOperator(1); }} public static TextCompareOperator EndsWith { get { return new TextCompareOperator(2); }} public static TextCompareOperator IsEqual { get { return new TextCompareOperator(3); }} public static TextCompareOperator IsNotEqual { get { return new TextCompareOperator(4); }} public static bool operator ==(TextCompareOperator a, TextCompareOperator b) { return a.value == b.value; } public static bool operator !=(TextCompareOperator a, TextCompareOperator b) { return a.value != b.value; } public override bool Equals (object o) { if (!(o is TextCompareOperator)) return false; return this == (TextCompareOperator)o; } public override int GetHashCode() { return value; } internal string GetSqlCompareString(string fieldName, string searchString) { string strCompare = null; if (this == TextCompareOperator.BeginsWith) strCompare = "{0} LIKE '{1}%'"; else if (this == TextCompareOperator.Contains) strCompare = "{0} LIKE '%{1}%'"; else if (this == TextCompareOperator.EndsWith) strCompare = "{0} LIKE '%{1}'"; else if (this == TextCompareOperator.IsEqual) strCompare = "{0} LIKE '{1}'"; // case insensitive //strCompare = "{0} = '{1}'"; else if (this == TextCompareOperator.IsNotEqual) strCompare = "{0} NOT LIKE '{1}'"; // case insensitive //strCompare = "{0} <> '{1}'"; return string.Format(strCompare, fieldName, searchString); } } } VolumeDB/src/Searching/SearchCriteriaGroup.cs0000664000175000017500000000533412067326706021355 0ustar patrickpatrick// SearchCriteriaGroup.cs // // Copyright (C) 2008 Patrick Ulbrich // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // // TODO: this class is new and fairly untested: completely test in all variations using System; using System.Text; using System.Collections; using System.Collections.Generic; namespace VolumeDB.Searching { public sealed class SearchCriteriaGroup : ISearchCriteria, IEnumerable { private MatchRule membersMatchRule; private List memberCriteria; private SearchCriteriaType searchCriteriaType; public SearchCriteriaGroup(MatchRule membersMatchRule) { this.membersMatchRule = membersMatchRule; this.memberCriteria = new List(); this.searchCriteriaType = SearchCriteriaType.None; } public void AddSearchCriteria(ISearchCriteria searchCriteria) { if (searchCriteria == null) throw new ArgumentNullException("searchCriteria"); memberCriteria.Add(searchCriteria); searchCriteriaType = searchCriteriaType | searchCriteria.SearchCriteriaType; } public MatchRule MembersMatchRule { get { return membersMatchRule; } } public int MemberCount { get { return memberCriteria.Count; } } public ISearchCriteria this[int index] { get { return memberCriteria[index]; } } #region IEnumerable Members IEnumerator IEnumerable.GetEnumerator() { foreach(ISearchCriteria sc in memberCriteria) yield return sc; } #endregion #region IEnumerable Members IEnumerator IEnumerable.GetEnumerator() { return ((IEnumerable)this).GetEnumerator(); } #endregion #region ISearchCriteria Members string ISearchCriteria.GetSqlSearchCondition() { StringBuilder sql = new StringBuilder(); foreach(ISearchCriteria sc in memberCriteria) { string condition = sc.GetSqlSearchCondition(); if (condition.Length > 0) SearchUtils.Append(sql, condition, membersMatchRule); } return sql.ToString(); } SearchCriteriaType ISearchCriteria.SearchCriteriaType { get { return searchCriteriaType; } } #endregion } } VolumeDB/src/Searching/CompareOperator.cs0000664000175000017500000000455012067326706020551 0ustar patrickpatrick// CompareOperator.cs // // Copyright (C) 2008 Patrick Ulbrich // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // using System; namespace VolumeDB.Searching { public struct CompareOperator { private int value; private CompareOperator(int value) { this.value = value; } public static CompareOperator Less { get { return new CompareOperator(0); }} public static CompareOperator LessOrEqual { get { return new CompareOperator(1); }} public static CompareOperator Equal { get { return new CompareOperator(2); }} public static CompareOperator NotEqual { get { return new CompareOperator(3); }} public static CompareOperator Greater { get { return new CompareOperator(4); }} public static CompareOperator GreaterOrEqual { get { return new CompareOperator(5); }} public static bool operator ==(CompareOperator a, CompareOperator b) { return a.value == b.value; } public static bool operator !=(CompareOperator a, CompareOperator b) { return a.value != b.value; } public override bool Equals (object o) { if (!(o is CompareOperator)) return false; return this == (CompareOperator)o; } public override int GetHashCode() { return value; } internal string GetSqlCompareString(string fieldName, string searchString) { string strOp = null; if (this == CompareOperator.Equal) strOp = "="; else if (this == CompareOperator.Greater) strOp = ">"; else if (this == CompareOperator.GreaterOrEqual) strOp = ">="; else if (this == CompareOperator.Less) strOp = "<"; else if (this == CompareOperator.LessOrEqual) strOp = "<="; else if(this == CompareOperator.NotEqual) strOp = "<>"; return string.Format("{0} {1} {2}", fieldName, strOp, searchString); } } } VolumeDB/src/Searching/FreeTextSearchCriteria.cs0000664000175000017500000000525712067326706022013 0ustar patrickpatrick// FreeTextSearchCriteria.cs // // Copyright (C) 2008 Patrick Ulbrich // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // using System; namespace VolumeDB.Searching { /* FreeTextSearchCriteria Simple freetextsearch implementation. Searches a string in different fields. */ public sealed class FreeTextSearchCriteria : ISearchCriteria { private string searchString; private IFreeTextSearchField fields; private TextCompareOperator compareOperator; private MatchRule fieldMatchRule; public FreeTextSearchCriteria(string searchString, IFreeTextSearchField fields, TextCompareOperator compareOperator) : this(searchString, fields, compareOperator, MatchRule.AnyMustMatch) {} public FreeTextSearchCriteria(string searchString, IFreeTextSearchField fields, TextCompareOperator compareOperator, MatchRule fieldMatchRule) { if (searchString == null) throw new ArgumentNullException("searchString"); if (searchString.Length < VolumeDatabase.MIN_SEARCHSTR_LENGTH) throw new ArgumentException(string.Format("Length of a searchstring must be at least {0}", VolumeDatabase.MIN_SEARCHSTR_LENGTH), "searchString"); // if (fields == FreeTextSearchField.None) if (fields == null || fields.IsEmpty) throw new ArgumentException("No searchfield specified", "fields"); this.searchString = searchString.Replace("'","''"); this.fields = fields; this.compareOperator = compareOperator; this.fieldMatchRule = fieldMatchRule; } public string SearchString { get { return searchString; } } public IFreeTextSearchField Fields { get { return fields; } } public TextCompareOperator CompareOperator { get { return compareOperator; } } public MatchRule FieldMatchRule { get { return fieldMatchRule; } } #region ISearchCriteria Members string ISearchCriteria.GetSqlSearchCondition() { return fields.GetSqlSearchCondition(searchString, compareOperator, fieldMatchRule); } SearchCriteriaType ISearchCriteria.SearchCriteriaType { get { return fields.ResultingSearchCriteriaType; } } #endregion } } VolumeDB/src/Searching/VolumeSearchCriteria/0000775000175000017500000000000012067326706021174 5ustar patrickpatrickVolumeDB/src/Searching/VolumeSearchCriteria/EUSLSearchCriteria.cs0000664000175000017500000001065012067326706025106 0ustar patrickpatrick// EUSLSearchCriteria.cs // // Copyright (C) 2010 Patrick Ulbrich // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // using System; using System.Collections.Generic; using VolumeDB.Searching.EUSL.Parsing; namespace VolumeDB.Searching.VolumeSearchCriteria { public sealed class EUSLSearchCriteria : AbstractEUSLSearchCriteria { private readonly Dictionary quantityFields = new Dictionary() { { "SIZE", QuantityField.Size }, { "DIRS", QuantityField.Dirs }, { "FILES", QuantityField.Files } }; public EUSLSearchCriteria(string euslQuery) : base(euslQuery) {} // TODO : // word, number and phrase terms are currently only compared against database field 'Title'. // they should probably compared to other common database fields as well. // but this would slow down searching a lot.. // maybe some smarter table indexers settings would help. internal override void OnTermParsed(TermParsedEventArgs e, out ISearchCriteria criteria) { criteria = null; switch (e.TermType) { case TermType.Number: criteria = new FreeTextSearchCriteria(e.Number.ToString(), FreeTextSearchField.Title, TextCompareOperator.Contains); break; case TermType.Phrase: criteria = new FreeTextSearchCriteria(e.Phrase, FreeTextSearchField.Title, TextCompareOperator.Contains); break; case TermType.Word: criteria = new FreeTextSearchCriteria(e.Word, FreeTextSearchField.Title, TextCompareOperator.Contains); break; case TermType.Select: string keyword = e.Keyword.ToUpper(); // try to map the keyword to a volumes quantity field if (quantityFields.ContainsKey(keyword)) { long byteSize = e.Number; if (byteSize == -1L) { try { byteSize = GetByteSize(e.Word); } catch (ArgumentException) { throw new ArgumentException( string.Format(S._("Operand for keyword '{0}' must be a number with an optional multiplier"), e.Keyword), "euslQuery"); } } CompareOperator cOp = CompareOperator.Equal; try { cOp = GetNumericCompareOpForRelation(e.Relation); } catch (ArgumentException) { throw new ArgumentException( string.Format(S._("Invalid compare operator for keyword '{0}'"), e.Keyword), "euslQuery"); } criteria = new QuantitySearchCriteria(quantityFields[keyword], byteSize, cOp); } else { // try to map the keyword to freetextsearch fields IFreeTextSearchField sf; try { sf = FreeTextSearchField.FromString(e.Keyword); } catch (ArgumentException) { throw new ArgumentException( string.Format(S._("Unknown keyword '{0}'"), e.Keyword), "euslQuery"); } TextCompareOperator tcOp = TextCompareOperator.Contains; try { tcOp = GetTextCompareOpForRelation(e.Relation); } catch (ArgumentException) { throw new ArgumentException( S._("Invalid compare operator for a keyword that maps to textual content"), "euslQuery"); } string s; if (e.Number != -1L) s = e.Number.ToString(); else if (e.Word != null) s = e.Word; else s = e.Phrase; // throws argument exception if searchstr is too short criteria = new FreeTextSearchCriteria(s, sf, tcOp); } break; } if (e.ExcludeTerm) criteria = new ExcludedSearchCriteria(criteria); } } }VolumeDB/src/Searching/VolumeSearchCriteria/FreeTextSearchField.cs0000664000175000017500000001122012067326706025337 0ustar patrickpatrick// FreeTextSearchCriteria.cs // // Copyright (C) 2009 Patrick Ulbrich // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // using System; using System.Collections.Generic; using System.Text; namespace VolumeDB.Searching.VolumeSearchCriteria { /* * Fields that the FreetextSearchCriteria can search. * Fields can be combined via the binary or operator ("|"). */ public struct FreeTextSearchField : IFreeTextSearchField { private static Dictionary stringMapping = new Dictionary() { { "TITLE", FreeTextSearchField.Title }, { "LOANEDTO", FreeTextSearchField.LoanedTo }, { "DESCRIPTION", FreeTextSearchField.Description }, { "KEYWORDS", FreeTextSearchField.Keywords } }; private uint value; private FreeTextSearchField(uint value) { this.value = value; } // note : ArchiveNo can't be used in a freetextsearchcriteria // since it is often < min searchstring length public static FreeTextSearchField None { get { return new FreeTextSearchField(0); }} // required for binary & public static FreeTextSearchField Title { get { return new FreeTextSearchField(1); }} public static FreeTextSearchField LoanedTo { get { return new FreeTextSearchField(2); }} public static FreeTextSearchField Description { get { return new FreeTextSearchField(4); }} public static FreeTextSearchField Keywords { get { return new FreeTextSearchField(8); }} // keywords of volumes public static FreeTextSearchField FromString(string fieldName) { FreeTextSearchField sf = FreeTextSearchField.None; if (fieldName == null) throw new ArgumentNullException("fieldName"); if (!stringMapping.TryGetValue(fieldName.ToUpper(), out sf)) throw new ArgumentException("Unknown fieldname", "fieldName"); return sf; } public static bool operator ==(FreeTextSearchField a, FreeTextSearchField b) { return a.value == b.value; } public static bool operator !=(FreeTextSearchField a, FreeTextSearchField b) { return a.value != b.value; } public static FreeTextSearchField operator |(FreeTextSearchField a, FreeTextSearchField b) { return new FreeTextSearchField(a.value | b.value); } public static FreeTextSearchField operator &(FreeTextSearchField a, FreeTextSearchField b) { return new FreeTextSearchField(a.value & b.value); } public override bool Equals (object o) { if (!(o is FreeTextSearchField)) return false; return this == (FreeTextSearchField)o; } public override int GetHashCode() { return (int)value; } /* * indicates whether a FreeTextSeachField value is a * bitwise combination of multiple FreeTextSeachField values. */ public bool IsCombined { get { return SearchUtils.IsCombined(value); } } private bool ContainsField(FreeTextSearchField field) { return (this & field) == field; } #region IFreeTextSearchField members /* get the sql search condition of this/these field/fields */ string IFreeTextSearchField.GetSqlSearchCondition(string searchString, TextCompareOperator compareOperator, MatchRule fieldMatchRule) { StringBuilder sql = new StringBuilder(); if (this.ContainsField(Title)) SearchUtils.Append(sql, compareOperator.GetSqlCompareString("Volumes.Title", searchString), fieldMatchRule); if (this.ContainsField(LoanedTo)) SearchUtils.Append(sql, compareOperator.GetSqlCompareString("Volumes.Loaned_To", searchString), fieldMatchRule); if (this.ContainsField(Description)) SearchUtils.Append(sql, compareOperator.GetSqlCompareString("Volumes.Description", searchString), fieldMatchRule); if (this.ContainsField(Keywords)) SearchUtils.Append(sql, compareOperator.GetSqlCompareString("Volumes.Keywords", searchString), fieldMatchRule); return sql.ToString(); } SearchCriteriaType IFreeTextSearchField.ResultingSearchCriteriaType { get { return SearchCriteriaType.VolumeSearchCriteria; } } bool IFreeTextSearchField.IsEmpty { get { return (this == FreeTextSearchField.None); } } #endregion } }VolumeDB/src/Searching/VolumeSearchCriteria/QuantitySearchCriteria.cs0000664000175000017500000000407612067326706026161 0ustar patrickpatrick// QuantitySearchCriteria.cs // // Copyright (C) 2009 Patrick Ulbrich // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // using System; namespace VolumeDB.Searching.VolumeSearchCriteria { public sealed class QuantitySearchCriteria : ISearchCriteria { private QuantityField quantityFields; private long quantity; private CompareOperator compareOperator; private MatchRule fieldMatchRule; public QuantitySearchCriteria(QuantityField fields, long quantity, CompareOperator compareOperator) : this(fields, quantity, compareOperator, MatchRule.AnyMustMatch) {} public QuantitySearchCriteria(QuantityField fields, long quantity, CompareOperator compareOperator, MatchRule fieldMatchRule) { if (quantity < 0) throw new ArgumentOutOfRangeException("quantity"); this.quantityFields = fields; this.quantity = quantity; this.compareOperator = compareOperator; this.fieldMatchRule = fieldMatchRule; } public QuantityField QuantityFields { get { return quantityFields; } } public long Quantity { get { return quantity; } } public CompareOperator CompareOperator { get { return compareOperator; } } #region ISearchCriteria Members string ISearchCriteria.GetSqlSearchCondition() { return quantityFields.GetSqlSearchCondition(quantity, compareOperator, fieldMatchRule); } SearchCriteriaType ISearchCriteria.SearchCriteriaType { get { return Searching.SearchCriteriaType.VolumeSearchCriteria; } } #endregion } } VolumeDB/src/Searching/VolumeSearchCriteria/QuantityField.cs0000664000175000017500000000706212067326706024312 0ustar patrickpatrick// QuantityField.cs // // Copyright (C) 2009 Patrick Ulbrich // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // using System; using System.Collections.Generic; using System.Text; namespace VolumeDB.Searching.VolumeSearchCriteria { public struct QuantityField { private static Dictionary stringMapping = new Dictionary() { { "FILES", QuantityField.Files }, { "DIRS", QuantityField.Dirs }, { "SIZE", QuantityField.Size } }; private uint value; private QuantityField(uint value) { this.value = value; } public static QuantityField None { get { return new QuantityField(0); }} // required for binary & public static QuantityField Files { get { return new QuantityField(1); }} public static QuantityField Dirs { get { return new QuantityField(2); }} public static QuantityField Size { get { return new QuantityField(4); }} public static QuantityField FromString(string quantityField) { QuantityField field = QuantityField.None; if (quantityField == null) throw new ArgumentNullException("quantityField"); if (!stringMapping.TryGetValue(quantityField.ToUpper(), out field)) throw new ArgumentException("Unknown fieldname", "quantityField"); return field; } public static bool operator ==(QuantityField a, QuantityField b) { return a.value == b.value; } public static bool operator !=(QuantityField a, QuantityField b) { return a.value != b.value; } public static QuantityField operator |(QuantityField a, QuantityField b) { return new QuantityField(a.value | b.value); } public static QuantityField operator &(QuantityField a, QuantityField b) { return new QuantityField(a.value & b.value); } public override bool Equals (object o) { if (!(o is QuantityField)) return false; return this == (QuantityField)o; } public override int GetHashCode() { return (int)value; } /* * indicates whether a QuantityField value is a * bitwise combination of multiple QuantityField values. */ public bool IsCombined { get { return SearchUtils.IsCombined(value); } } private bool ContainsField(QuantityField field) { return (this & field) == field; } /* get the sql search condition of this/these field/fields */ internal string GetSqlSearchCondition(long quantity, CompareOperator compareOperator, MatchRule fieldMatchRule) { StringBuilder sql = new StringBuilder(); string strQuantity = quantity.ToString(); if (this.ContainsField(Files)) SearchUtils.Append(sql, compareOperator.GetSqlCompareString("Volumes.Files", strQuantity), fieldMatchRule); if (this.ContainsField(Dirs)) SearchUtils.Append(sql, compareOperator.GetSqlCompareString("Volumes.Dirs", strQuantity), fieldMatchRule); if (this.ContainsField(Size)) SearchUtils.Append(sql, compareOperator.GetSqlCompareString("Volumes.Size", strQuantity), fieldMatchRule); return sql.ToString(); } } } VolumeDB/src/Searching/SearchUtils.cs0000664000175000017500000000263312067326706017675 0ustar patrickpatrick// SearchUtils.cs // // Copyright (C) 2009 Patrick Ulbrich // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // using System; using System.Text; namespace VolumeDB.Searching { internal static class SearchUtils { // indicates whether a uint is a combination of flag bits public static bool IsCombined(uint flags) { if (flags == 0) return false; uint n = 1; while (n < flags && n != 0) n = n << 1; // n = n * 2 // if n != flags, value is not a power of 2 // and thus a combination of multiple bits return n != flags; } // append a searchcondition to a sql string public static void Append(StringBuilder sql, string condition, MatchRule mr) { if (sql.Length > 0) sql.AppendFormat(" {0} ", mr.GetSqlLogicalOperator()); sql.Append('(').Append(condition).Append(')'); } } } VolumeDB/src/Searching/ItemSearchCriteria/0000775000175000017500000000000012067326706020623 5ustar patrickpatrickVolumeDB/src/Searching/ItemSearchCriteria/IDSearchCriteria.cs0000664000175000017500000000323212067326706024257 0ustar patrickpatrick// IDSearchCriteria.cs // // Copyright (C) 2008 Patrick Ulbrich // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // using System; namespace VolumeDB.Searching.ItemSearchCriteria { public sealed class IDSearchCriteria : ISearchCriteria { private long id; private IDSearchField field; private CompareOperator compareOperator; public IDSearchCriteria(long id, IDSearchField field, CompareOperator compareOperator) { if (id < 0) throw new ArgumentException("Invalid id"); this.id = id; this.field = field; this.compareOperator = compareOperator; } public long Id { get { return id; } } public IDSearchField Field { get { return field; } } public CompareOperator CompareOperator { get { return compareOperator; } } #region ISearchCriteria Members string ISearchCriteria.GetSqlSearchCondition() { return field.GetSqlSearchCondition(id, compareOperator); } SearchCriteriaType ISearchCriteria.SearchCriteriaType { get { return Searching.SearchCriteriaType.ItemSearchCriteria; } } #endregion } } VolumeDB/src/Searching/ItemSearchCriteria/EUSLSearchCriteria.cs0000664000175000017500000001241612067326706024537 0ustar patrickpatrick// EUSLSearchCriteria.cs // // Copyright (C) 2009, 2010 Patrick Ulbrich // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // using System; using VolumeDB.Searching.EUSL.Parsing; namespace VolumeDB.Searching.ItemSearchCriteria { public sealed class EUSLSearchCriteria : AbstractEUSLSearchCriteria { public EUSLSearchCriteria(string euslQuery) : base(euslQuery) {} // TODO : // word, number and phrase terms are currently only compared against database field 'Name'. // they should probably compared to other common database fields as well. // but this would slow down searching a lot.. // maybe some smarter table indexers settings would help. internal override void OnTermParsed(TermParsedEventArgs e, out ISearchCriteria criteria) { criteria = null; switch (e.TermType) { case TermType.Number: criteria = new FreeTextSearchCriteria(e.Number.ToString(), FreeTextSearchField.AnyName, TextCompareOperator.Contains); break; case TermType.Phrase: criteria = new FreeTextSearchCriteria(e.Phrase, FreeTextSearchField.AnyName, TextCompareOperator.Contains); break; case TermType.Word: criteria = new FreeTextSearchCriteria(e.Word, FreeTextSearchField.AnyName, TextCompareOperator.Contains); break; case TermType.Select: string keyword = e.Keyword.ToUpper(); if (keyword == "FILESIZE") { long byteSize = e.Number; if (byteSize == -1L) { try { byteSize = GetByteSize(e.Word); } catch (ArgumentException) { throw new ArgumentException( string.Format(S._("Operand for keyword '{0}' must be a number with an optional multiplier"), e.Keyword), "euslQuery"); } } CompareOperator cOp = CompareOperator.Equal; try { cOp = GetNumericCompareOpForRelation(e.Relation); } catch (ArgumentException) { throw new ArgumentException( string.Format(S._("Invalid compare operator for keyword '{0}'"), e.Keyword), "euslQuery"); } criteria = new FileSizeSearchCriteria(byteSize, cOp); } else if (keyword == "TYPE") { if (string.IsNullOrEmpty(e.Word)) throw new ArgumentException( string.Format(S._("Operand for keyword '{0}' must be a string"), e.Keyword), "euslQuery"); // try to map the word of the type selector to a MediaType MediaType type = MediaType.None; try { type = MediaType.FromString(e.Word); } catch (ArgumentException) { throw new ArgumentException( string.Format(S._("Unknown type '{0}'"), e.Word), "euslQuery"); } if (e.Relation != Relation.Equal) { throw new ArgumentException( string.Format(S._("Keyword '{0}' only supports the equality operator ('=')"), e.Keyword), "euslQuery"); } criteria = new MediaTypeSearchCriteria(type); } else { // try to map the keyword to freetextsearch fields IFreeTextSearchField sf; // try to map the keyword to a VOLUME freetextsearchfield. // note: keywords mapping to foreign table fields // should be prefixed with the respective table name. if (keyword == "VOLUME-TITLE") { sf = VolumeSearchCriteria.FreeTextSearchField.Title; } else { // try to map the keyword to an ITEM freetextsearchfield try { sf = FreeTextSearchField.FromString(e.Keyword); } catch (ArgumentException) { throw new ArgumentException( string.Format(S._("Unknown keyword '{0}'"), e.Keyword), "euslQuery"); } } TextCompareOperator tcOp = TextCompareOperator.Contains; try { tcOp = GetTextCompareOpForRelation(e.Relation); } catch (ArgumentException) { throw new ArgumentException( S._("Invalid compare operator for a keyword that maps to textual content"), "euslQuery"); } string s; if (e.Number != -1L) s = e.Number.ToString(); else if (e.Word != null) s = e.Word; else s = e.Phrase; // throws argument exception if searchstr is too short criteria = new FreeTextSearchCriteria(s, sf, tcOp); } break; } if (e.ExcludeTerm) criteria = new ExcludedSearchCriteria(criteria); } } } VolumeDB/src/Searching/ItemSearchCriteria/FreeTextSearchField.cs0000664000175000017500000001523512067326706025000 0ustar patrickpatrick// FreeTextSearchField.cs // // Copyright (C) 2008 Patrick Ulbrich // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // // TODO : // allow text searching in fields MimeType, MetaData or // write specific SearchCriteria classes (analogous FileSizeSearchCriteria)? #define ALLOW_FREETEXTSEARCH_MIMETYPE #define ALLOW_FREETEXTSEARCH_METADATA using System; using System.Collections.Generic; using System.Text; namespace VolumeDB.Searching.ItemSearchCriteria { /* * Fields that the FreetextSearchCriteria can search. * Fields can be combined via the binary or operator ("|"). */ public struct FreeTextSearchField : IFreeTextSearchField { private static Dictionary stringMapping = new Dictionary() { { "FILENAME", FreeTextSearchField.FileName }, { "DIRECTORYNAME", FreeTextSearchField.DirectoryName }, { "LOCATION", FreeTextSearchField.Location }, { "NOTE", FreeTextSearchField.Note }, { "KEYWORDS", FreeTextSearchField.Keywords }, #if ALLOW_FREETEXTSEARCH_MIMETYPE { "MIMETYPE", FreeTextSearchField.MimeType }, #endif #if ALLOW_FREETEXTSEARCH_METADATA { "METADATA", FreeTextSearchField.MetaData } #endif }; private uint value; private FreeTextSearchField(uint value) { this.value = value; } public static FreeTextSearchField None { get { return new FreeTextSearchField(0); }} // required for binary & public static FreeTextSearchField FileName { get { return new FreeTextSearchField(1); }} public static FreeTextSearchField DirectoryName { get { return new FreeTextSearchField(2); }} public static FreeTextSearchField Location { get { return new FreeTextSearchField(4); }} public static FreeTextSearchField Note { get { return new FreeTextSearchField(8); }} public static FreeTextSearchField Keywords { get { return new FreeTextSearchField(16); }} // keywords of items #if ALLOW_FREETEXTSEARCH_MIMETYPE public static FreeTextSearchField MimeType { get { return new FreeTextSearchField(32); }} #endif #if ALLOW_FREETEXTSEARCH_METADATA public static FreeTextSearchField MetaData { get { return new FreeTextSearchField(64); }} #endif public static FreeTextSearchField AnyName { get { return new FreeTextSearchField((FileName | DirectoryName).value); }} public static FreeTextSearchField FromString(string fieldName) { FreeTextSearchField sf = FreeTextSearchField.None; if (fieldName == null) throw new ArgumentNullException("fieldName"); if (!stringMapping.TryGetValue(fieldName.ToUpper(), out sf)) throw new ArgumentException("Unknown fieldname", "fieldName"); return sf; } public static bool operator ==(FreeTextSearchField a, FreeTextSearchField b) { return a.value == b.value; } public static bool operator !=(FreeTextSearchField a, FreeTextSearchField b) { return a.value != b.value; } public static FreeTextSearchField operator |(FreeTextSearchField a, FreeTextSearchField b) { return new FreeTextSearchField(a.value | b.value); } public static FreeTextSearchField operator &(FreeTextSearchField a, FreeTextSearchField b) { return new FreeTextSearchField(a.value & b.value); } public override bool Equals (object o) { if (!(o is FreeTextSearchField)) return false; return this == (FreeTextSearchField)o; } public override int GetHashCode() { return (int)value; } /* * indicates whether a FreeTextSeachField value is a * bitwise combination of multiple FreeTextSeachField values. */ public bool IsCombined { get { return SearchUtils.IsCombined(value); } } private bool ContainsField(FreeTextSearchField field) { return (this & field) == field; } #region IFreeTextSearchField members /* get the sql search condition of this/these field/fields */ string IFreeTextSearchField.GetSqlSearchCondition(string searchString, TextCompareOperator compareOperator, MatchRule fieldMatchRule) { StringBuilder sql = new StringBuilder(); if (this.ContainsField(AnyName)) { // search name fields of _all_ possible volume itemtypes (e.g. DirectoryName, FileName, ...) SearchUtils.Append(sql, compareOperator.GetSqlCompareString("Items.Name", searchString), fieldMatchRule); } else { if (this.ContainsField(DirectoryName)) { SearchUtils.Append( sql, compareOperator.GetSqlCompareString("Items.Name", searchString) + string.Format(" AND (Items.ItemType = {0})", (int)VolumeItemType.DirectoryVolumeItem), fieldMatchRule ); } if (this.ContainsField(FileName)) { SearchUtils.Append( sql, compareOperator.GetSqlCompareString("Items.Name", searchString) + string.Format(" AND (Items.ItemType = {0})", (int)VolumeItemType.FileVolumeItem), fieldMatchRule ); } } if (this.ContainsField(Keywords)) { SearchUtils.Append(sql, compareOperator.GetSqlCompareString("Items.Keywords", searchString), fieldMatchRule); } if (this.ContainsField(Location)) { SearchUtils.Append( sql, compareOperator.GetSqlCompareString("Items.Location", searchString) + string.Format(" AND ((Items.ItemType = {0}) OR (Items.ItemType = {1}))", (int)VolumeItemType.FileVolumeItem, (int)VolumeItemType.DirectoryVolumeItem), fieldMatchRule ); } if (this.ContainsField(Note)) { SearchUtils.Append(sql, compareOperator.GetSqlCompareString("Items.Note", searchString), fieldMatchRule); } #if ALLOW_FREETEXTSEARCH_MIMETYPE if (this.ContainsField(MimeType)) { SearchUtils.Append(sql, compareOperator.GetSqlCompareString("Items.MimeType", searchString), fieldMatchRule); } #endif #if ALLOW_FREETEXTSEARCH_METADATA if (this.ContainsField(MetaData)) { SearchUtils.Append(sql, compareOperator.GetSqlCompareString("Items.MetaData", searchString), fieldMatchRule); } #endif return sql.ToString(); } SearchCriteriaType IFreeTextSearchField.ResultingSearchCriteriaType { get { return SearchCriteriaType.ItemSearchCriteria; } } bool IFreeTextSearchField.IsEmpty { get { return (this == FreeTextSearchField.None); } } #endregion } } VolumeDB/src/Searching/ItemSearchCriteria/MediaTypeSearchCriteria.cs0000664000175000017500000000322712067326706025650 0ustar patrickpatrick// MediaTypeSearchCriteria.cs // // Copyright (C) 2009 Patrick Ulbrich // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // using System; namespace VolumeDB.Searching.ItemSearchCriteria { public sealed class MediaTypeSearchCriteria : ISearchCriteria { private MediaType types; private MatchRule typeMatchRule; public MediaTypeSearchCriteria(MediaType types) : this(types, MatchRule.AnyMustMatch) { } public MediaTypeSearchCriteria(MediaType types, MatchRule typeMatchRule) { if (types == MediaType.None) throw new ArgumentException("No type specified", "types"); this.types = types; this.typeMatchRule = typeMatchRule; } public MediaType Types { get { return types; } } public MatchRule TypeMatchRule { get { return typeMatchRule; } } #region ISearchCriteria Members string ISearchCriteria.GetSqlSearchCondition() { return types.GetSqlSearchCondition(typeMatchRule); } SearchCriteriaType ISearchCriteria.SearchCriteriaType { get { return Searching.SearchCriteriaType.ItemSearchCriteria; } } #endregion } } VolumeDB/src/Searching/ItemSearchCriteria/FileSizeSearchCriteria.cs0000664000175000017500000000515712067326706025505 0ustar patrickpatrick// FileSizeSearchCriteria.cs // // Copyright (C) 2008 Patrick Ulbrich // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // using System; namespace VolumeDB.Searching.ItemSearchCriteria { public sealed class FileSizeSearchCriteria : ISearchCriteria { private long fileSize; private CompareOperator compareOperator; /// /// /// /// filesize in bytes /// operator that specifies how to compare filesizes public FileSizeSearchCriteria(long fileSize, CompareOperator compareOperator) { if (fileSize < 0) throw new ArgumentOutOfRangeException("fileSize"); this.fileSize = fileSize; this.compareOperator = compareOperator; } public long FileSize { get { return fileSize; } } public CompareOperator CompareOperator { get { return compareOperator; } } #region ISearchCriteria Members string ISearchCriteria.GetSqlSearchCondition() { // string strOp; // switch (compareOperator) { // case CompareOperator.Equal: // strOp = "="; // break; // case CompareOperator.Greater: // strOp = ">"; // break; // case CompareOperator.GreaterOrEqual: // strOp = ">="; // break; // case CompareOperator.Less: // strOp = "<"; // break; // case CompareOperator.LessOrEqual: // strOp = "<="; // break; // case CompareOperator.NotEqual: // strOp = "<>"; // break; // default: // throw new Exception("Invalid CompareOperator."); // } // return string.Format("(Items.Size {0} {1}) AND (ItemType = {2})", strOp, fileSize, (int)VolumeItemType.FileVolumeItem); return string.Format("({0}) AND (Items.ItemType = {1})", compareOperator.GetSqlCompareString("Items.Size", fileSize.ToString()), (int)VolumeItemType.FileVolumeItem); } SearchCriteriaType ISearchCriteria.SearchCriteriaType { get { return Searching.SearchCriteriaType.ItemSearchCriteria; } } #endregion } } VolumeDB/src/Searching/ItemSearchCriteria/IDSearchField.cs0000664000175000017500000000422512067326706023543 0ustar patrickpatrick// IDSearchField.cs // // Copyright (C) 2008 Patrick Ulbrich // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // using System; namespace VolumeDB.Searching.ItemSearchCriteria { /* * Fields that the IDSearchCriteria can search. */ public struct IDSearchField { private int value; private IDSearchField(int value) { this.value = value; } public static IDSearchField ItemID { get { return new IDSearchField(1); }} public static IDSearchField VolumeID { get { return new IDSearchField(2); }} public static IDSearchField ParentID { get { return new IDSearchField(3); }} public static bool operator ==(IDSearchField a, IDSearchField b) { return a.value == b.value; } public static bool operator !=(IDSearchField a, IDSearchField b) { return a.value != b.value; } public override bool Equals (object o) { if (!(o is IDSearchField)) return false; return this == (IDSearchField)o; } public override int GetHashCode() { return value; } /* get the sql search condition of this field */ internal string GetSqlSearchCondition(long id, CompareOperator compareOperator) { string fieldName = string.Empty; if (this == IDSearchField.ItemID) fieldName = "ItemID"; else if (this == IDSearchField.ParentID) fieldName = "ParentID"; else if (this == IDSearchField.VolumeID) fieldName = "VolumeID"; else throw new NotImplementedException(string.Format("IDSearchField {0} not implemented", value)); return compareOperator.GetSqlCompareString(fieldName, id.ToString()); } } } VolumeDB/src/Searching/ItemSearchCriteria/MediaType.cs0000664000175000017500000000725312067326706023042 0ustar patrickpatrick// MediaType.cs // // Copyright (C) 2009 Patrick Ulbrich // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // using System; using System.Collections.Generic; using System.Text; namespace VolumeDB.Searching.ItemSearchCriteria { public struct MediaType { private static Dictionary stringMapping = new Dictionary() { { "AUDIO", MediaType.Audio }, { "VIDEO", MediaType.Video }, { "IMAGE", MediaType.Image }, { "TEXT", MediaType.Text }, { "DIRECTORY", MediaType.Directory } }; private uint value; private MediaType(uint value) { this.value = value; } // mimetype sections public static MediaType None { get { return new MediaType(0); }} // required for binary & public static MediaType Audio { get { return new MediaType(1); }} public static MediaType Video { get { return new MediaType(2); }} public static MediaType Image { get { return new MediaType(4); }} public static MediaType Text { get { return new MediaType(8); }} public static MediaType Directory { get { return new MediaType(16); }} public static MediaType FromString(string mediaType) { MediaType type = MediaType.None; if (mediaType == null) throw new ArgumentNullException("mediaType"); if (!stringMapping.TryGetValue(mediaType.ToUpper(), out type)) throw new ArgumentException("Unknown mediatype", "mediaType"); return type; } public static bool operator ==(MediaType a, MediaType b) { return a.value == b.value; } public static bool operator !=(MediaType a, MediaType b) { return a.value != b.value; } public static MediaType operator |(MediaType a, MediaType b) { return new MediaType(a.value | b.value); } public static MediaType operator &(MediaType a, MediaType b) { return new MediaType(a.value & b.value); } public override bool Equals (object o) { if (!(o is MediaType)) return false; return this == (MediaType)o; } public override int GetHashCode() { return (int)value; } /* * indicates whether a MediaType value is a * bitwise combination of multiple MediaType values. */ public bool IsCombined { get { return SearchUtils.IsCombined(value); } } private bool ContainsType(MediaType type) { return (this & type) == type; } /* get the sql search condition of this/these type/types */ internal string GetSqlSearchCondition(MatchRule typeMatchRule) { StringBuilder sql = new StringBuilder(); if (this.ContainsType(Audio)) SearchUtils.Append(sql, "Items.MimeType LIKE 'audio/%'", typeMatchRule); if (this.ContainsType(Video)) SearchUtils.Append(sql, "Items.MimeType LIKE 'video/%'", typeMatchRule); if (this.ContainsType(Image)) SearchUtils.Append(sql, "Items.MimeType LIKE 'image/%'", typeMatchRule); if (this.ContainsType(Text)) SearchUtils.Append(sql, "Items.MimeType LIKE 'text/%'", typeMatchRule); if (this.ContainsType(Directory)) SearchUtils.Append(sql, "Items.MimeType = 'x-directory/normal'", typeMatchRule); return sql.ToString(); } } } VolumeDB/src/Searching/AbstractEUSLSearchCriteria.cs0000664000175000017500000001377412067326706022524 0ustar patrickpatrick// AbstractEUSLSearchCriteria.cs // // Copyright (C) 2010 Patrick Ulbrich // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // using System; using System.Globalization; using VolumeDB.Searching.EUSL.Scanning; using VolumeDB.Searching.EUSL.Parsing; namespace VolumeDB.Searching { public abstract class AbstractEUSLSearchCriteria : ISearchCriteria { private ISearchCriteria searchCriteria; public AbstractEUSLSearchCriteria(string euslQuery) { if (euslQuery == null) throw new ArgumentNullException("euslQuery"); // EUSL's default collector is and const Collect DEFAULT_COLLECT = Collect.And; Parser p = new Parser(); SearchCriteriaGroup outerOrGroup = new SearchCriteriaGroup(MatchRule.AnyMustMatch); SearchCriteriaGroup innerAndGroup = null; Collect c = DEFAULT_COLLECT; ISearchCriteria prevCriteria = null; // parser eventhandler definition p.CollectParsed += (object sender, CollectParsedEventArgs e) => { c = e.Collect; }; // parser eventhandler definition p.TermParsed += (object sender, TermParsedEventArgs e) => { ISearchCriteria currCriteria; OnTermParsed(e, out currCriteria); // assign previous criteria if (prevCriteria != null) { if (c == Collect.Or) { if (innerAndGroup != null) { innerAndGroup.AddSearchCriteria(prevCriteria); outerOrGroup.AddSearchCriteria(innerAndGroup); innerAndGroup = null; } else { outerOrGroup.AddSearchCriteria(prevCriteria); } } else { // and if (innerAndGroup == null) innerAndGroup = new SearchCriteriaGroup(MatchRule.AllMustMatch); innerAndGroup.AddSearchCriteria(prevCriteria); } } prevCriteria = currCriteria; c = DEFAULT_COLLECT; // restore default collector }; try { // parse the searchstatement // and call the event handlers. // all exceptions occuring in the eventhandlers // are thrown here as well. p.Parse(euslQuery); } catch (UnexpectedTokenException e) { throw new ArgumentException( string.Format(S._("Parsing error: search statement is malformed at position {0}"), e.Token.pos), "euslQuery", e); } catch (ScannerException e) { throw new ArgumentException( string.Format(S._("Parsing error: search statement is malformed at position {0}"), e.Pos), "euslQuery", e); } // add last remaining criteria if (prevCriteria != null) { if (innerAndGroup != null) { innerAndGroup.AddSearchCriteria(prevCriteria); outerOrGroup.AddSearchCriteria(innerAndGroup); innerAndGroup = null; } else { outerOrGroup.AddSearchCriteria(prevCriteria); } } searchCriteria = outerOrGroup; } internal /*protected*/ abstract void OnTermParsed(TermParsedEventArgs e, out ISearchCriteria criteria); protected static long GetByteSize(string sizeStr) { int exp = 0; if (string.IsNullOrEmpty(sizeStr)) throw new ArgumentException("sizeStr is empty", "sizeStr"); if (sizeStr[sizeStr.Length - 1] == 'B' || sizeStr[sizeStr.Length - 1] == 'b') sizeStr = sizeStr.Substring(0, sizeStr.Length - 1); if (sizeStr.Length > 1) { switch(sizeStr[sizeStr.Length - 1]) { case 'k': case 'K': exp = 10; sizeStr = sizeStr.Substring(0, sizeStr.Length - 1); break; case 'm': case 'M': exp = 20; sizeStr = sizeStr.Substring(0, sizeStr.Length - 1); break; case 'g': case 'G': exp = 30; sizeStr = sizeStr.Substring(0, sizeStr.Length - 1); break; case 't': case 'T': exp = 40; sizeStr = sizeStr.Substring(0, sizeStr.Length - 1); break; } } double factor; NumberStyles ns = NumberStyles.AllowDecimalPoint; NumberFormatInfo ni = CultureInfo.InvariantCulture.NumberFormat; if (!double.TryParse(sizeStr, ns, ni, out factor)) throw new ArgumentException("Bad size format"); long bytes = (long)((factor * Math.Pow(2, exp)) + 0.5); return bytes; } internal /*protected*/ static CompareOperator GetNumericCompareOpForRelation(Relation rel) { CompareOperator cOp = CompareOperator.Equal; switch (rel) { case Relation.Equal: cOp = CompareOperator.Equal; break; case Relation.Greater: cOp = CompareOperator.Greater; break; case Relation.GreaterOrEqual: cOp = CompareOperator.GreaterOrEqual; break; case Relation.Less: cOp = CompareOperator.Less; break; case Relation.LessOrEqual: cOp = CompareOperator.LessOrEqual; break; default: throw new ArgumentException("Specified relation is not suited for numeric comparision"); } return cOp; } internal /*protected*/ static TextCompareOperator GetTextCompareOpForRelation(Relation rel) { TextCompareOperator tcOp = TextCompareOperator.Contains; switch (rel) { case Relation.Contains: tcOp = TextCompareOperator.Contains; break; case Relation.Equal: tcOp = TextCompareOperator.IsEqual; break; default: throw new ArgumentException("Specified relation is not suited for textual comparision"); } return tcOp; } #region ISearchCriteria Members string ISearchCriteria.GetSqlSearchCondition() { return searchCriteria.GetSqlSearchCondition(); } SearchCriteriaType ISearchCriteria.SearchCriteriaType { get { return searchCriteria.SearchCriteriaType; } } #endregion } } VolumeDB/src/Searching/MatchRule.cs0000664000175000017500000000276612067326706017342 0ustar patrickpatrick// MatchRule.cs // // Copyright (C) 2008 Patrick Ulbrich // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // using System; namespace VolumeDB.Searching { public struct MatchRule { private int value; private MatchRule(int value) { this.value = value; } public static MatchRule AllMustMatch { get { return new MatchRule(0); }} public static MatchRule AnyMustMatch { get { return new MatchRule(1); }} public static bool operator ==(MatchRule a, MatchRule b) { return a.value == b.value; } public static bool operator !=(MatchRule a, MatchRule b) { return a.value != b.value; } public override bool Equals (object o) { if (!(o is MatchRule)) return false; return this == (MatchRule)o; } public override int GetHashCode() { return value; } internal string GetSqlLogicalOperator() { return this == MatchRule.AllMustMatch ? "AND" : "OR"; } } } VolumeDB/src/UnsupportedDbVersionException.cs0000664000175000017500000000166612067326706021574 0ustar patrickpatrick// UnsupportedDbVersionException.cs // // Copyright (C) 2008 Patrick Ulbrich // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // using System; namespace VolumeDB { public class UnsupportedDbVersionException : Exception { public UnsupportedDbVersionException() : base() {} public UnsupportedDbVersionException(string msg) : base(msg) {} } } VolumeDB/src/BufferedVolumeItemWriter.cs0000664000175000017500000000467712067326706020504 0ustar patrickpatrick// BufferedVolumeItemWriter.cs // // Copyright (C) 2008 Patrick Ulbrich // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // using System; namespace VolumeDB { internal sealed class BufferedVolumeItemWriter : IDisposable { private VolumeDatabase database; private bool leaveOpen; private int buffCounter; // buffer counter private VolumeItem[] buffer; private bool disposed; public BufferedVolumeItemWriter(VolumeDatabase database, int size) : this(database, false, size) { } public BufferedVolumeItemWriter(VolumeDatabase database, bool leaveOpen, int size) { if (database == null) throw new ArgumentNullException("database"); if (size < 1) throw new ArgumentOutOfRangeException("size"); this.database = database; this.leaveOpen = leaveOpen; this.buffer = new VolumeItem[size]; this.disposed = false; Reset(); } public void Write(VolumeItem item) { EnsureOpen(); buffer[buffCounter++] = item; if (buffCounter >= buffer.Length) { database.InsertVolumeItems(buffer); buffCounter = 0; } } public void Flush() { EnsureOpen(); if (buffCounter > 0) { VolumeItem[] remainder = new VolumeItem[buffCounter]; Array.Copy(buffer, remainder, buffCounter); database.InsertVolumeItems(remainder); buffCounter = 0; } } public void Reset() { buffCounter = 0; } public void Close() { Dispose(true); } private void EnsureOpen() { if (disposed) throw new ObjectDisposedException(this.ToString()); } private void Dispose(bool disposing) { if (!disposed) { if (disposing) { this.Flush(); if (database != null && !leaveOpen) database.Close(); } buffer = null; database = null; disposed = true; } } #region IDisposable Members void IDisposable.Dispose() { Dispose(true); } #endregion } } VolumeDB/src/VolumeItemType.cs0000664000175000017500000000160412067326706016471 0ustar patrickpatrick// VolumeItemType.cs // // Copyright (C) 2008, 2010 Patrick Ulbrich // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // using System; namespace VolumeDB { public enum VolumeItemType { DirectoryVolumeItem = 0, FileVolumeItem = 1, AudioCdRootVolumeItem = 2, AudioTrackVolumeItem = 3 } } VolumeDB/src/S.cs0000664000175000017500000000314312067326706013743 0ustar patrickpatrick// S.cs // // Copyright (C) 2008, 2009, 2011 Patrick Ulbrich // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // using System; using System.Globalization; using System.Reflection; using Platform.Common.Globalization; namespace VolumeDB { // shorthand to Catalog.GetString() internal static class S { private static Catalog c; private static string ns; static S() { ns = String.Format("{0}.{1}", Assembly.GetCallingAssembly().GetName().Name, "po"); c = Catalog.GetCatalogForCulture(CultureInfo.CurrentUICulture, ns, true); } public static void SetCulture(CultureInfo ci) { if (ci == null) throw new ArgumentNullException("ci"); c = Catalog.GetCatalogForCulture(ci, ns, true); } public static void SetCulture(string name) { if (name == null) throw new ArgumentNullException("name"); c = Catalog.GetCatalogForCulture(name, ns, true); } public static string _(string msgid) { return c.GetString(msgid); } } } VolumeDB/src/FileVolumeItem.cs0000664000175000017500000000721712067326706016435 0ustar patrickpatrick// FileVolumeItem.cs // // Copyright (C) 2008 Patrick Ulbrich // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // using System; namespace VolumeDB { public sealed class FileVolumeItem : FileSystemVolumeItem, IHashable { //private string filename; //private string extension; private long size; private string hash; internal FileVolumeItem(VolumeDatabase database) : base(database, VolumeItemType.FileVolumeItem) { //filename = null; //extension = null; size = 0L; hash = null; } /// /// Required by internal factory methods like AbstractVolumeScanner.GetNewVolumeItem() /// Purpose : /// /// - guarantee that _all_ fields of this type are initialized by the caller /// (in contrast to property initialization, which easily makes you miss a property [in particular if a new one was added..]) /// /// /// - seperate fields of a type from fields of its base type (e.g. GetNewVolumeItem() initializes all fields of a the VolumeItem base type. /// Caller code only needs to initialize fields of the derived type) /// /// internal void SetFileVolumeItemFields(/*string extension,*/ long size, string hash) { //ValidateFilename(filename); //this.filename = filename; //this.extension = extension; this.size = size; this.hash = hash; } // FileVolumeItem specific implementation of IChildItem.GetParent() public DirectoryVolumeItem GetDirectory() { return (DirectoryVolumeItem) ((IChildItem)this).GetParent(); } //private static void ValidateFilename(string filename) //{ // if (filename == null) // throw new ArgumentNullException("filename"); // if (filename.Length == 0) // throw new ArgumentException("filename is empty"); //} internal override void ReadFromVolumeDBRecord(IRecordData recordData) { base.ReadFromVolumeDBRecord(recordData); //filename = (string) recordData["Filename"]; //extension = Util.ReplaceDBNull( recordData["Extension"], null); size = (long) recordData["Size"]; hash = Util.ReplaceDBNull( recordData["Hash"], null); } internal override void WriteToVolumeDBRecord(IRecordData recordData) { base.WriteToVolumeDBRecord(recordData); //recordData.AddField("Filename", filename); //recordData.AddField("Extension", extension); recordData.AddField("Size", size); recordData.AddField("Hash", hash); } #region read-only properties //public string Filename //{ // get { return filename ?? string.Empty } // internal set // { // //ValidateFilename(value); // filename = value; // } //} //public string Extension { // get { return extension ?? string.Empty; } // internal set { extension = value; } //} public long Size { get { return size; } internal set { size = value; } } public string Hash { get { return hash ?? string.Empty; } internal set { hash = value; } } #endregion } } VolumeDB/src/VolumeDBDataType.cs0000664000175000017500000001142012067326706016647 0ustar patrickpatrick// VolumeDBDataType.cs // // Copyright (C) 2008 Patrick Ulbrich // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // using System; using System.Collections; using System.Collections.Generic; namespace VolumeDB { /// /// Baseclass of all types that represent a datatype of the VolumeDatabase. /// public abstract class VolumeDBDataType : IVolumeDBRecord { //private bool isInserted; private string tableName; private string[] primarykeyFields; private bool isNew; internal VolumeDBDataType(string tableName, string[] primarykeyFields) { if (tableName == null) throw new ArgumentNullException("tableName"); // don't check primarykeyFields for null. // primarykeyFields can be null for tables without primarykey and just one record. this.tableName = tableName; this.primarykeyFields = primarykeyFields; this.isNew = true; } #region IVolumeDBRecord Members string IVolumeDBRecord.TableName { get { return tableName; } } string[] IVolumeDBRecord.PrimaryKeyFields { get { if ((primarykeyFields != null) && (primarykeyFields.Length > 0)) { // pass a copy of the primarykeyFields array, // the string elements themselves are immutable and don't need to be copied. string[] copy = new string[primarykeyFields.Length]; Array.Copy(primarykeyFields, copy, primarykeyFields.Length); return copy; } else { return new string[0]; } } } bool IVolumeDBRecord.IsNew { get { return isNew; } set { isNew = value; } } IRecordData IVolumeDBRecord.GetRecordData() { IRecordData recordData = new __RecordData_Dictionary_Impl(); WriteToVolumeDBRecord(recordData); return recordData; } void IVolumeDBRecord.SetRecordData(IRecordData recordData) { ReadFromVolumeDBRecord(recordData); } #endregion // TODO : make this member internally protected in case this language feature has become real // see http://lab.msdn.microsoft.com/productfeedback/viewfeedback.aspx?feedbackid=33c53cf6-2709-4cc9-a408-6cafee4313ef //protected internal abstract void ReadFromVolumeDBRecord(IRecordData recordData); // TODO : make this member internally protected in case this language feature has become real // see http://lab.msdn.microsoft.com/productfeedback/viewfeedback.aspx?feedbackid=33c53cf6-2709-4cc9-a408-6cafee4313ef //protected internal abstract void WriteToVolumeDBRecord(IRecordData recordData); /// /// Creates a new record from the object in the associated VolumeDatabase object. /// Publicly inaccessible. /// internal abstract void InsertIntoDB(); /// /// Saves back changes to the associated VolumeDatabase object. /// public abstract void UpdateChanges(); /// /// Indicates whether the object has been inserted into the associated VolumeDatabase object. /// internal bool IsInserted { get { return !((IVolumeDBRecord)this).IsNew; } } protected static void EnsurePropertyLength(string val, int maxLen) { if (val != null && val.Length > maxLen) throw new ArgumentException(string.Format("The length of this propertys value must be <= {0}", maxLen)); } #region private class __RecordData_Dictionary_Impl private class __RecordData_Dictionary_Impl : Dictionary, IRecordData { public __RecordData_Dictionary_Impl() : base() { } #region IRecordData Members public new object this[string fieldName] { get { return base[fieldName]; } } public object GetValue(string fieldName) { return this[fieldName]; } public void AddField(string fieldName, object value) { this.Add(fieldName, value); } #endregion #region IEnumerable Members IEnumerator IEnumerable.GetEnumerator() { foreach (KeyValuePair pair in ((IEnumerable>)this)) yield return new FieldnameValuePair(pair.Key, pair.Value); } #endregion #region IEnumerable Members IEnumerator IEnumerable.GetEnumerator() { return ((IEnumerable)this).GetEnumerator(); } #endregion } #endregion } } VolumeDB/src/IContainerItem.cs0000664000175000017500000000254212067326706016415 0ustar patrickpatrick// IContainerItem.cs // // Copyright (C) 2008 Patrick Ulbrich // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // using System; namespace VolumeDB { /* interface for abstract hierarchical parent/child item access * * should be implemented explicitely since * a) it is not meant to be called on a VolumeItem directly * (rather via "entry" methods like Volume.GetRootItem()) * b) specific VolumeItem implementations implement less abstract members * (i.e. alias-methods with a more specific/meaningful name) * that map to members of this interface. * (e.g. DirectoryVolumeItem.GetDirectories() --> IContainerItem.GetContainers()) */ public interface IContainerItem : IChildItem { IChildItem[] GetItems(); IContainerItem[] GetContainers(); } } VolumeDB/src/AudioCdVolume.cs0000664000175000017500000000522412067326706016243 0ustar patrickpatrick// AudioCdVolume.cs // // Copyright (C) 2010 Patrick Ulbrich // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // using System; namespace VolumeDB { public sealed class AudioCdVolume : Volume { private int tracks; private TimeSpan duration; internal AudioCdVolume(VolumeDatabase database) : base(database, VolumeType.AudioCdVolume) { this.tracks = 0; this.duration = new TimeSpan(0, 0, 0); } /// /// Required by internal factory methods like AbstractVolumeScanner.CreateVolumeObject() /// Purpose : /// /// - guarantee that _all_ fields of this type are initialized by the caller /// (in contrast to property initialization, which easily makes you miss a property [in particular if a new one was added..]) /// /// /// - seperate fields of a type from fields of its base type (e.g. AbstractVolumeScanner.CreateVolumeObject() initializes all fields of a the Volume base type. /// Caller code only needs to initialize fields of the derived Volume type) /// /// internal void SetAudioCdVolumeFields(int tracks, TimeSpan duration) { this.tracks = tracks; this.duration = duration; } // AudioCdVolume specific implementation of Volume.GetRoot() public new AudioCdRootVolumeItem GetRoot() { return (AudioCdRootVolumeItem)base.GetRoot(); } internal override void ReadFromVolumeDBRecord(IRecordData recordData) { base.ReadFromVolumeDBRecord(recordData); tracks = (int)(long)recordData["Files"]; long tmp = (long)recordData["Size"]; duration = TimeSpan.FromSeconds(tmp); } internal override void WriteToVolumeDBRecord(IRecordData recordData) { base.WriteToVolumeDBRecord(recordData); recordData.AddField("Files", tracks); recordData.AddField("Size", (long)duration.TotalSeconds); } #region read-only properties public int Tracks { get { return tracks; } internal set { tracks = value; } } public TimeSpan Duration { get { return duration; } internal set { duration = value; } } #endregion } } VolumeDB/src/VolumeItem.cs0000664000175000017500000002242312067326706015631 0ustar patrickpatrick// VolumeItem.cs // // Copyright (C) 2008, 2010, 2011 Patrick Ulbrich // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // using System; using System.Collections.Generic; using VolumeDB.Metadata; // TODO : IDiposable to free VolumeDatabase? (if yes, do so in Volume class as well!) namespace VolumeDB { /// /// Base class of all VolumeItem types (files, directories, ...) /// public abstract class VolumeItem : VolumeDBDataType, IChildItem { // length constants used by // - client programs to validate user input // - this class to validate _user_ input to _public_ properties // - VolumeDatabase when creating tables public const int MAX_NAME_LENGTH = 256; public const int MAX_NOTE_LENGTH = 4096; public const int MAX_KEYWORDS_LENGTH = 4096; internal const int MAX_MIMETYPE_LENGTH = 64; internal const int MAX_METADATA_LENGTH = 4096; internal const int MAX_HASH_LENGTH = 64; // table info required by VolumeDBDataType private const string tableName = "Items"; private static readonly string[] primarykeyFields = { "VolumeID", "ItemID" }; private long volumeID; private long itemID; //private long rootID; private long parentID; private string name; private string mimeType; // content type private MetadataStore metaData; private string note; private string keywords; //private Volume ownerVolume; private VolumeDatabase database; private VolumeItemType itemType; internal VolumeItem(VolumeDatabase database, VolumeItemType itemType) : base(tableName, primarykeyFields) { this.volumeID = 0L; this.itemID = 0L; //this.rootID = 0L; this.parentID = 0L; this.name = null; this.mimeType = null; this.metaData = MetadataStore.Empty; this.note = null; this.keywords = null; //this.ownerVolume = null; this.database = database; this.itemType = itemType; } /// /// Required by internal factory methods like AbstractVolumeScanner.GetNewVolumeItem() /// Purpose : /// /// - guarantee that _all_ fields of this type are initialized by the caller /// (in contrast to property initialization, which easily makes you miss a property [in particular if a new one was added..]) /// /// /// - seperate fields of a type from fields of its base type (e.g. GetNewVolumeItem() initializes all fields of a the VolumeItem base type. /// Caller code only needs to initialize fields of the derived type) /// /// internal void SetVolumeItemFields( long volumeID, long itemID, //long rootID, long parentID, string name, string mimeType, MetadataStore metaData, string note, string keywords /*Volume ownerVolume*/ ) { this.volumeID = volumeID; this.itemID = itemID; //this.m_rootID = rootID; this.parentID = parentID; this.name = name; this.mimeType = mimeType; this.metaData = metaData; this.note = note; this.keywords = keywords; //this.ownerVolume = ownerVolume; } public VolumeItemType GetVolumeItemType() { return itemType; } #region IChildItem Members // implemented explicitely as derived VolumeItem types may not have a parent item. // if they have, they implement a specific parent-getter if needed (e.g. FileVolumeItem.GetDirectory()). IContainerItem IChildItem.GetParent() { return (IContainerItem)Database.GetVolumeItem(volumeID, parentID); } #endregion public Volume GetOwnerVolume() { /* do not cache, always pull a fresh instance from the database to get possible changes made to the owner volume record. */ return Database.GetVolume(volumeID); } internal override void ReadFromVolumeDBRecord(IRecordData recordData) { volumeID = (long) recordData["VolumeID"]; itemID = (long) recordData["ItemID"]; //rootID = (long) recordData["RootID"]; parentID = (long) recordData["ParentID"]; name = Util.ReplaceDBNull( recordData["Name"], null); mimeType = Util.ReplaceDBNull( recordData["MimeType"], null); metaData = new MetadataStore(Util.ReplaceDBNull( recordData["MetaData"], null)); note = Util.ReplaceDBNull( recordData["Note"], null); keywords = Util.ReplaceDBNull( recordData["Keywords"], null); } internal override void WriteToVolumeDBRecord(IRecordData recordData) { recordData.AddField("VolumeID", volumeID); recordData.AddField("ItemID", itemID); //recordData.AddField("RootID", rootID); recordData.AddField("ParentID", parentID); recordData.AddField("ItemType", itemType); recordData.AddField("Name", name); recordData.AddField("MimeType", mimeType); // NOTE : metadata can't be null since it is a struct recordData.AddField("MetaData", metaData.MetadataString); recordData.AddField("Note", note); recordData.AddField("Keywords", keywords); } internal override void InsertIntoDB() { // TODO : owner volume must not be saved // -- if there are many items to be updated, // the ownerVolume will be updated in the database for every single item as well Database.InsertVolumeItem(this); } public override void UpdateChanges() { // TODO : owner volume must not be saved // -- if there are many items to be updated, // the ownerVolume will be updated in the database for every single item as well Database.UpdateVolumeItem(this); } internal static VolumeItem CreateInstance(VolumeItemType type, VolumeDatabase database) { VolumeItem item = null; switch (type) { case VolumeItemType.DirectoryVolumeItem: item = new DirectoryVolumeItem(database); break; case VolumeItemType.FileVolumeItem: item = new FileVolumeItem(database); break; case VolumeItemType.AudioCdRootVolumeItem: item = new AudioCdRootVolumeItem(database); break; case VolumeItemType.AudioTrackVolumeItem: item = new AudioTrackVolumeItem(database); break; default: throw new NotImplementedException(string.Format("Instantiation of type {0} is not implemented", type.ToString())); } return item; } // //TODO : remove this method if generic constraints allow internal and parameterized constructors. // //It is used as a workaround to instanciate a VolumeItem object, // //because the internal VolumeItem constructor with the database parameter can't be used in generic code. // //see http://lab.msdn.microsoft.com/productfeedback/viewfeedback.aspx?feedbackid=9a8e58ee-1371-4e99-8385-c3e2a4157fd6 // //see http://lab.msdn.microsoft.com/productfeedback/viewfeedback.aspx?feedbackid=80517ec1-2d08-43cc-bc90-9927877061a9 // internal static VolumeItem CreateInstance(VolumeDB database) // where TVolumeItem : VolumeItem // { // Type t = typeof(TVolumeItem); // // if (t == typeof(FileVolumeItem)) // return new FileVolumeItem(database); // else if(t == typeof(DirectoryVolumeItem)) // return new DirectoryVolumeItem(database); // else // throw new NotImplementedException(string.Format("Instanciation of type {0} is not implemented.", t.ToString())); // } #region read-only properties public long VolumeID { get { return volumeID; } internal set { volumeID = value; } } public long ItemID { get { return itemID; } internal set { itemID = value; } } //// TODO : make internal after reorganisation if it isn't needed publicly //public long RootID //{ // get { return m_rootID; } // internal set { m_rootID = value; } //} public long ParentID { get { return parentID; } internal set { parentID = value; } } public string Name { get { return name ?? string.Empty; } internal set { name = value; } } public string MimeType { get { return mimeType ?? string.Empty; } internal set { mimeType = value; } } public MetadataStore MetaData { // NOTE : metadata can't be null since it is a struct get { return metaData; } internal set { metaData = value; } } #endregion #region editable properties public string Note { get { return note ?? string.Empty; } set { EnsurePropertyLength(value, MAX_NOTE_LENGTH); note = value; } } public string Keywords { get { return keywords ?? string.Empty; } set { EnsurePropertyLength(value, MAX_KEYWORDS_LENGTH); keywords = value; } } #endregion public override string ToString() { return Name; } protected VolumeDatabase Database { get { if (database == null) throw new InvalidOperationException("No database associated"); return database; } } } }VolumeDB/src/VolumeScanner/0000775000175000017500000000000012067326706015772 5ustar patrickpatrickVolumeDB/src/VolumeScanner/FilesystemScannerOptions.cs0000664000175000017500000000344612067326706023342 0ustar patrickpatrick// FilesystemScannerOptions.cs // // Copyright (C) 2010, 2011 Patrick Ulbrich // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // using System; using System.Collections.Generic; using VolumeDB.Metadata; namespace VolumeDB.VolumeScanner { public class FilesystemScannerOptions : ScannerOptions { public FilesystemScannerOptions() : base() { DiscardSymLinks = false; GenerateThumbnails = false; MetadataProviders = null; DbDataPath = null; } public bool DiscardSymLinks { get; set; } public bool GenerateThumbnails { get; set; } public IEnumerable MetadataProviders { get; set; } public string DbDataPath { get; set; } protected override void CopyOptions(ScannerOptions opts) { if (!(opts is FilesystemScannerOptions)) return; FilesystemScannerOptions tmp = opts as FilesystemScannerOptions; tmp.DiscardSymLinks = this.DiscardSymLinks; tmp.GenerateThumbnails = this.GenerateThumbnails; // don't deep-copy the metadata providers, it's too expensive // (e.g. native libextractor instantiation and initialization) tmp.MetadataProviders = this.MetadataProviders; tmp.DbDataPath = this.DbDataPath; } } } VolumeDB/src/VolumeScanner/AbstractVolumeScanner.cs0000664000175000017500000004367712067326706022607 0ustar patrickpatrick// AbstractVolumeScanner.cs // // Copyright (C) 2008 - 2012 Patrick Ulbrich // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // using System; using System.Threading; using System.ComponentModel; using System.Reflection; using VolumeDB.Metadata; using Platform.Common.Diagnostics; using PlatformIO = Platform.Common.IO; namespace VolumeDB.VolumeScanner { public abstract class AbstractVolumeScanner : IVolumeScanner where TVolume : Volume where TVolumeInfo : VolumeInfo where TOpts : ScannerOptions, new() { private PlatformIO.DriveInfo drive; private VolumeDatabase database; private long itemID; // item id counter //private VolumeDatabase.IdCounter itemIdCounter; private TVolume volume; // TODO : media is defined on memberlevel now (not passed from outside anymore).. dispose() anything? private TVolumeInfo volumeInfo; // basic readonly info about the volume being scanned private TOpts options; private volatile bool isRunning; private volatile bool cancellationRequested; private AsyncOperation asyncOperation; private volatile bool scanSucceeded; private bool disposed; // note: // do not allow to modify the constuctor parameters // (i.e. database, options) // through public properties later, since the scanner // may already use them after scanning has been started, // and some stuff has been initialized depending on the // options in the ctor already. internal AbstractVolumeScanner(PlatformIO.DriveInfo drive, VolumeDatabase database, TOpts options) { if (drive == null) throw new ArgumentNullException("drive"); if (!drive.IsReady) throw new ArgumentException("Drive is not ready", "drive"); if (options == null) throw new ArgumentNullException("options"); /* don't test database for null -- database is optional */ if ((options.BufferSize < 1) && (database != null)) throw new ArgumentOutOfRangeException("BufferSize"); this.isRunning = false; //m_cancellationRequested = false; this.scanSucceeded = false; this.disposed = false; this.drive = drive; this.database = database; // copy options reference so that they can't be modified // while the scanner is running already. this.options = new TOpts(); options.CopyTo(this.options); this.itemID = VolumeDatabase.ID_NONE; this.volume = CreateVolumeObject(drive, database, options.ComputeHashs); this.volumeInfo = CreateInstance(volume); } #region IVolumeScanner Members public WaitHandle RunAsync() { if (isRunning) throw new InvalidOperationException("Scanner is already running"); if (scanSucceeded) throw new InvalidOperationException("Scanning has been completed successfully. Create a new scanner to scan another volume"); try { /* must be set (as soon as possible) in a function that is _not_ called asynchronously * (i.e. dont call it in ScanningThread()) */ isRunning = true; cancellationRequested = false; asyncOperation = AsyncOperationManager.CreateOperation(null); Reset(); BufferedVolumeItemWriter writer = null; if (this.HasDB) writer = new BufferedVolumeItemWriter(database, true, Options.BufferSize); /* invoke the scanning function on a new thread and return a waithandle */ Action st = ScanningThread; IAsyncResult ar = st.BeginInvoke(drive, volume, writer, null, null); return ar.AsyncWaitHandle; } catch (Exception) { isRunning = false; if (asyncOperation != null) asyncOperation.OperationCompleted(); throw; } } public void CancelAsync() { cancellationRequested = true; } public bool IsBusy { get { return isRunning; } } public bool ScanSucceeded { get { return scanSucceeded; } } //Media IMediaScanner.Media //{ // get { return m_media; } //} /* * implemented explicitely since AbstractVolumeScanner * also implements a scanner specific VolumeInfo property. */ VolumeInfo IVolumeScanner.VolumeInfo { get { return volumeInfo; } } public event BeforeScanItemEventHandler BeforeScanItem; public event ScannerWarningEventHandler ScannerWarning; public event ErrorEventHandler Error; public event ScanCompletedEventHandler ScanCompleted; #endregion public TVolumeInfo VolumeInfo { get { return volumeInfo; } } protected void CheckForCancellationRequest() { if (cancellationRequested) throw new ScanCancelledException(); } #region IDisposable Members public void Dispose() { Dispose(true); } #endregion protected virtual void Dispose(bool disposing) { if (!disposed) { if (disposing) { if (this.IsBusy) throw new InvalidOperationException("Scan in progress"); /* if (m_db != null) m_db.Close(); // TODO ? leavOpen in Scanworker.ctor after database parameter? PASS THIS leavOpen PARAMETER AT THE BufferedItemWriter INSTANCIATION AS WELL!!! m_media.Dispose(); // TODO ? (in case m_media implements IDisposable because of the MediaDB reference anytime later) */ } drive = null; database = null; volume = null; volumeInfo = null; options = null; asyncOperation = null; disposed = true; } } protected virtual void Reset() { volumeInfo.Reset(); if (this.HasDB) { //// TODO : this is neither threadsave nor multi-instance save in general! maybe the db (physical db, MediaDB object? this scanner?) should be locked during scanning? USE MONITOR thread locker? INTERLOCKED class? //itemID = database.GetNextItemID(); itemID = VolumeDatabase.ID_FIRST; } // TODO : // reset values of Volumebase like CreatedDate here? // (or not? at last it has been created by the first try) } protected bool HasDB { get { return (database != null); } } protected VolumeDatabase Database { get { if (database == null) throw new InvalidOperationException("No database associated"); return database; } } protected TOpts Options { get { return options; } } // TODO : remove parameter itemType if generic constraints allow internal and parameterized constructors. // Parameter itemType is used as a workaround to instanciate a VolumeItem object, // because the internal VolumeItem constructor with the database parameter can't be used in generic code. // see http://lab.msdn.microsoft.com/productfeedback/viewfeedback.aspx?feedbackid=9a8e58ee-1371-4e99-8385-c3e2a4157fd6 // see http://lab.msdn.microsoft.com/productfeedback/viewfeedback.aspx?feedbackid=80517ec1-2d08-43cc-bc90-9927877061a9 /// /// Returns a specific VolumeItem object, but preassigns properties of the VolumeItem baseclass only. /// Filling properties of the specific, derived object, is job of the specific VolumeScanner implementation. /// /// Type of the specific volume item. /// /// A new specific VolumeItem derived from base class VolumeItem /// with all base class properties preassigned. /// protected TVolumeItem GetNewVolumeItem(long parentID, string name, string mimeType, MetadataStore metaData, VolumeItemType itemType) where TVolumeItem : VolumeItem { // TODO: check here if TMediaItem applies to TMedia? /* TVolumeItem item = new TVolumeItem(database); */ TVolumeItem item = (TVolumeItem)VolumeItem.CreateInstance(itemType, database); // initialize fields of the VolumeItem base class. // don't initialize via properties. initializing via properties is error-prone // as the compiler won't error if a new field is added to the base class // and forgotten to be initialized here. item.SetVolumeItemFields(volume.VolumeID, itemID, parentID, name, mimeType, metaData, null, null); itemID++; return item; } /// // Returns a specific Volume object, but preassigns properties of the Volume baseclass only. // Filling properties of the specific, derived object, is job of the specific VolumeScanner implementation. /// private static TVolume CreateVolumeObject(PlatformIO.DriveInfo d, VolumeDatabase database, bool isHashed) { // TODO : check here whether everything is still filled correctly after media class reorganisation long volumeID = VolumeDatabase.ID_NONE; if (database != null) { // TODO : this is neither threadsave nor multi-instance save in general! // maybe the db (physical db, VolumeDatabase object? this scanner?) should be locked during scanning? volumeID = database.GetNextVolumeID(); } TVolume v = CreateInstance(database); // /* v = new TVolume(database); */ // v = (TVolume)VolumeDB.Volume.CreateInstance(volumeType, database); // // initialize fields of the Volume base class. // don't initialize via properties. initializing via properties is error-prone // as the compiler won't error if a new field is added to the base class // and forgotten to be initialized here. v.SetVolumeFields( volumeID, d.IsMounted ? d.VolumeLabel : string.Empty, DateTime.Now, /*di.VolumeSerialNumber,*/ isHashed, volumeID.ToString(), d.DriveType.ToVolumeDriveType(), null, DateTime.MinValue, DateTime.MinValue, null, null, null ); return v; } /// /// Overriden by VolumeScanner implementations to implement specific scanning logic. /// The purpose of this function is to scan a volume /// and populate the passed objects Volume and BufferedVolumeItemWriter with the information acquired. /// If an error occurs, ScannintThreadMain() should throw an exception, /// for non-fatal errors it should call SendScannerWarning() /// Note: ScanningThreadMain() is running on a new thread. /// /// /// driveInfo object of the volume to be scanned. /// /// /// Specific Volume object that has to be populated with the information acquired. /// Fields of the base class are already preassigned. /// This parameter is null if the VolumeScanner is not connected to a VolumeDatabase object. /// /// /// BufferedVolumeItemWriter that receives VolumeItem objects populated with the information acquired. /// This parameter is null if the VolumeScanner is not connected to a VolumeDatabase object. /// // TODO : make this member internally protected in case this language feature has become real // see http://lab.msdn.microsoft.com/productfeedback/viewfeedback.aspx?feedbackid=33c53cf6-2709-4cc9-a408-6cafee4313ef //protected internal abstract void ScanningThreadMain(PlatformIO.DriveInfo drive, TVolume volume, BufferedVolumeItemWriter writer); private void ScanningThread(PlatformIO.DriveInfo drive, TVolume volume, BufferedVolumeItemWriter writer) { TVolume returnVolume = null; Exception fatalError = null; bool cancelled = false; try { if (this.HasDB) Database.TransactionBegin(); // locks VolumeDatabase ScanningThreadMain(drive, volume, writer); if (this.HasDB) { writer.Close(); if (!volume.IsInserted) volume.InsertIntoDB(); returnVolume = volume; database.TransactionCommit(); // unlocks VolumeDatabase } //result = ScanningResult.Success; scanSucceeded = true; } catch (Exception ex) { Exception rollbackException = null; try { // rollback all database changes if (this.HasDB) database.TransactionRollback(); // unlocks VolumeDatabase } catch (Exception e) { rollbackException = e; } if (ex is ScanCancelledException) { //result = ScanningResult.Cancelled; cancelled = true; } else { //result = ScanningResult.FatalError; /* save the error that caused the scanner to stop (scanning failure) */ fatalError = ex; //OnError(new ErrorEventArgs(ex)); PostError(ex); Debug.WriteLine("Details for exception in ScanningThread():\n" + ex.ToString()); } // in case an error occured while rollig back, // post the error here, _after_ the initial error that made the scan fail. if (rollbackException != null) { //OnError(new ErrorEventArgs(rollbackException)); PostError(rollbackException); } //#if THROW_EXCEPTIONS_ON_ALL_THREADS // if (!(ex is ScanCancelledException)) // throw; //#endif } finally { /* * TODO : unlock db / thread // (in try / catch / PostError !!) */ //if (result == ScanningResult.Success) // m_scanSucceeded = true; //m_cancellationRequested = false; isRunning = false; //try { OnScanCompleted(new ScanCompletedEventArgs(result, mediaID, fatalError)); } //catch (Exception e) { OnError(new ErrorEventArgs(e)); } PostCompleted(returnVolume, fatalError, cancelled); } } /// /// Called right before the next item is scanned. /// protected void PostBeforeScanItem(string itemName) { SendOrPostCallback cb = delegate(object args) { OnBeforeScanItem((BeforeScanItemEventArgs)args); }; BeforeScanItemEventArgs e = new BeforeScanItemEventArgs(itemName); asyncOperation.Post(cb, e); } /// /// Called if a non-critical error occurs while scanning. /// Throws a ScanCancelledException if an eventhandler sets e.CancelScanning to true. /// This methods blocks until the called eventhandler returns. /// protected void SendScannerWarning(string message, Exception ex) { SendOrPostCallback cb = delegate(object args) { OnScannerWarning((ScannerWarningEventArgs)args); }; ScannerWarningEventArgs e = new ScannerWarningEventArgs(message, ex); asyncOperation.SynchronizationContext.Send(cb, e); if (e.CancelScanning) throw new ScanCancelledException(); } /// /// Called if a non-critical error occurs while scanning. /// Throws a ScanCancelledException if an eventhandler sets e.CancelScanning to true. /// This methods blocks until the called eventhandler returns. /// protected void SendScannerWarning(string message) { SendScannerWarning(message, null); } /// /// Called when an unhandled exception occurs. /// private void PostError(Exception ex) { SendOrPostCallback cb = delegate(object args) { OnError((ErrorEventArgs)args); }; ErrorEventArgs e = new ErrorEventArgs(ex); asyncOperation.Post(cb, e); } /// /// Called when scanning has been completed. /// private void PostCompleted(Volume volume, Exception error, bool cancelled) { SendOrPostCallback cb = delegate(object args) { OnScanCompleted((ScanCompletedEventArgs)args); }; ScanCompletedEventArgs e = new ScanCompletedEventArgs(volume, error, cancelled); asyncOperation.PostOperationCompleted(cb, e); } #region Events private void OnBeforeScanItem(BeforeScanItemEventArgs e) { if (this.BeforeScanItem != null) this.BeforeScanItem(this, e); } private void OnScannerWarning(ScannerWarningEventArgs e) { if (this.ScannerWarning != null) this.ScannerWarning(this, e); //if (e.Cancel) // throw new ScanCancelledException(); } private void OnError(ErrorEventArgs e) { //try //{ if (this.Error != null) this.Error(this, e); //} //catch (Exception ex) //{ // System.Diagnostics.Debug.WriteLine(ex); //} } private void OnScanCompleted(ScanCompletedEventArgs e) { if (this.ScanCompleted != null) this.ScanCompleted(this, e); } #endregion #region Exceptions /// /// Signals that scanning has been cancelled. /// protected class ScanCancelledException : Exception { public ScanCancelledException() : base() { } } #endregion //TODO : remove this method if generic constraints allow internal and parameterized constructors. //see http://lab.msdn.microsoft.com/productfeedback/viewfeedback.aspx?feedbackid=9a8e58ee-1371-4e99-8385-c3e2a4157fd6 //see http://lab.msdn.microsoft.com/productfeedback/viewfeedback.aspx?feedbackid=80517ec1-2d08-43cc-bc90-9927877061a9 // don't use this method to create objects frequently, it uses reflection and thus is slow! private static T CreateInstance(params object[] args) { Type[] argTypes = new Type[args.Length]; for(int i = 0; i < argTypes.Length; i++) argTypes[i] = args[i].GetType(); ConstructorInfo ci = typeof(T).GetConstructor(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance, null, argTypes, null); return (T)ci.Invoke(args); } } } VolumeDB/src/VolumeScanner/ScannerOptions.cs0000664000175000017500000000227212067326706021271 0ustar patrickpatrick// ScannerOptions.cs // // Copyright (C) 2010, 2011 Patrick Ulbrich // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // using System; namespace VolumeDB.VolumeScanner { public abstract class ScannerOptions { public ScannerOptions () { BufferSize = 10; ComputeHashs = false; } public int BufferSize { get; set; } public bool ComputeHashs { get; set; } public void CopyTo(ScannerOptions opts) { CopyOptions(opts); opts.BufferSize = this.BufferSize; opts.ComputeHashs = this.ComputeHashs; } protected abstract void CopyOptions(ScannerOptions opts); } } VolumeDB/src/VolumeScanner/Events.cs0000664000175000017500000000626712067326706017600 0ustar patrickpatrick// Events.cs // // Copyright (C) 2008 Patrick Ulbrich // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // using System; namespace VolumeDB.VolumeScanner { public delegate void BeforeScanItemEventHandler(object sender, BeforeScanItemEventArgs e); public delegate void ScannerWarningEventHandler(object sender, ScannerWarningEventArgs e); public delegate void ErrorEventHandler(object sender, ErrorEventArgs e); public delegate void ScanCompletedEventHandler(object sender, ScanCompletedEventArgs e); public class BeforeScanItemEventArgs : EventArgs { private string itemName; public BeforeScanItemEventArgs(string itemName) : base() { this.itemName = itemName; } public string ItemName { get { return itemName ?? string.Empty; } } } public class ScannerWarningEventArgs : EventArgs { private bool cancel; private string message; private Exception ex; public ScannerWarningEventArgs(string message, Exception ex) : base() { this.cancel = false; this.message = message; this.ex = ex; } public ScannerWarningEventArgs(string message) : this(message, null) { } //public ScannerWarningEventArgs() : this(null, null) { } public bool CancelScanning { get { return cancel; } set { cancel = value; } } public string Message { get { return message ?? string.Empty; } } public Exception Exception { get { return ex; } } } public class ErrorEventArgs : EventArgs { private Exception ex; public ErrorEventArgs(Exception ex) : base() { this.ex = ex; } //public ErrorEventArgs() : this(null) {} public Exception Exception { get { return ex; } } } public class ScanCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { //private ScanningResult m_result; //private long volumeID; private Volume volume; //private Exception m_fatalError; //public ScanCompletedEventArgs(ScanningResult result, long mediaID, Exception fatalError) : base() public ScanCompletedEventArgs(Volume volume, Exception error, bool cancelled) : base(error, cancelled, null) { //m_result = result; //this.volumeID = volumeID; this.volume = volume; //m_fatalError = fatalError; } //public ScanCompletedEventArgs(ScanningResult result, long mediaID) : this(result, mediaID, null) {} //public ScanningResult Result //{ // get { return m_result; } //} // public long VolumeID { // get { // RaiseExceptionIfNecessary(); // return volumeID; // } // } public Volume Volume { get {return volume; } } //public Exception FatalError //{ // get { return m_fatalError; } //} } } VolumeDB/src/VolumeScanner/AudioCdScannerOptions.cs0000664000175000017500000000227312067326706022523 0ustar patrickpatrick// AudioCdScannerOptions.cs // // Copyright (C) 2010 Patrick Ulbrich // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // using System; namespace VolumeDB.VolumeScanner { public class AudioCdScannerOptions : ScannerOptions { public AudioCdScannerOptions () : base() { EnableMusicBrainz = false; } public bool EnableMusicBrainz { get; set; } protected override void CopyOptions(ScannerOptions opts) { if (!(opts is AudioCdScannerOptions)) return; AudioCdScannerOptions tmp = opts as AudioCdScannerOptions; tmp.EnableMusicBrainz = this.EnableMusicBrainz; } } } VolumeDB/src/VolumeScanner/VolumeProber.cs0000664000175000017500000000720612067326706020747 0ustar patrickpatrick// VolumeProber.cs // // Copyright (C) 2008, 2010 Patrick Ulbrich // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // // TODO : // use inline docs for GetScanner() in MediaScannerBase ctor and GenericMediaScanner as well using System; using PlatformIO = Platform.Common.IO; namespace VolumeDB.VolumeScanner { public static class VolumeProber { /// /// Values returned by VolumeProber.ProbeVolume() /// public enum VolumeProbeResult { Unknown = 0, Filesystem = 1, AudioCd = 2 // ... } public static VolumeProbeResult ProbeVolume(PlatformIO.DriveInfo drive) { VolumeProbeResult result = VolumeProbeResult.Unknown; if (drive == null) throw new ArgumentNullException("drive"); if (!drive.IsReady) throw new ArgumentException("Drive is not ready", "drive"); // check for audio cd first - // win32 also mounts audio cds as filesystems if (drive.HasAudioCdVolume) { return VolumeProbeResult.AudioCd; } else if (drive.IsMounted) { return VolumeProbeResult.Filesystem; } return result; } // /// Probes a volume, creates the appropriate VolumeScanner and returns a general interface to it. /// /// Drive to be scanned /// VolumeDatabase object /// ScannerOptions for all possible scanners /// Interface to the proper VolumeScanner public static IVolumeScanner GetScannerForVolume(PlatformIO.DriveInfo drive, VolumeDatabase database, ScannerOptions[] options) { if (drive == null) throw new ArgumentNullException("drive"); if (!drive.IsReady) throw new ArgumentException("Drive is not ready", "drive"); if (options == null) throw new ArgumentNullException("options"); IVolumeScanner scanner = null; VolumeProbeResult result = ProbeVolume(drive); switch (result) { case VolumeProbeResult.Filesystem: scanner = new FilesystemVolumeScanner(drive, database, GetOptions(options)); break; case VolumeProbeResult.AudioCd: scanner = new AudioCdVolumeScanner(drive, database, GetOptions(options)); break; case VolumeProbeResult.Unknown: throw new ArgumentException("Volume is of an unknown type"); default: throw new NotImplementedException(string.Format("VolumeProbeResult {0} is not implemented", result.ToString())); } return scanner; } private static TOpts GetOptions(ScannerOptions[] options) where TOpts : ScannerOptions { foreach (ScannerOptions opt in options) { if (opt is TOpts) return (TOpts)opt; } throw new ArgumentException(string.Format("Missing options for type {0}", typeof(TOpts))); } } }VolumeDB/src/VolumeScanner/VolumeInfo.cs0000664000175000017500000000377312067326706020416 0ustar patrickpatrick// VolumeInfo.cs // // Copyright (C) 2008 Patrick Ulbrich // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // using System; namespace VolumeDB.VolumeScanner { /* * Class for the VolumeInfo property of the AbstractVolumeScanner class. * It provides basic readonly info about the volume being scanned. * There is no need to make properties threadsafe since they are written to * on AbstractVolumeScanner construction time only. * (this does not apply to derived classes which are populated during scanning! * (client may read while scanner writes)) */ public abstract class VolumeInfo { private Volume volume; internal VolumeInfo(Volume v) { this.volume = v; } internal abstract void Reset(); // The VolumeID should not be exposed here to prevent users from accessing the // Volume in the database before it and its items have been written to database completely. // The VolumeID will be available in the scanners ScanCompleted event that will be // raised when scanning has been finished. public string ArchiveNo { get { return volume.ArchiveNo; } } public string Title { get { return volume.Title; } } public DateTime Added { get { return volume.Added; } } public bool IsHashed { get { return volume.IsHashed; } } public VolumeDriveType DriveType { get { return volume.DriveType; } } public VolumeType GetVolumeType() { return volume.GetVolumeType(); } } } VolumeDB/src/VolumeScanner/AudioCdVolumeScanner.cs0000664000175000017500000001501112067326706022331 0ustar patrickpatrick// AudioCdVolumeScanner.cs // // Copyright (C) 2010, 2011 Patrick Ulbrich // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // using System; using System.Collections.Generic; using PlatformIO = Platform.Common.IO; using MusicBrainz; using VolumeDB.Metadata; namespace VolumeDB.VolumeScanner { public sealed class AudioCdVolumeScanner : AbstractVolumeScanner { private const string MIME_TYPE_AUDIO_TRACK = "audio/x-wav"; private const string PRESELECTED_CATEGORY = "Music"; // note: // do not allow to modify the constuctor parameters // (i.e. database, options) // through public properties later, since the scanner // may already use them after scanning has been started, // and some stuff has been initialized depending on the // options in the ctor already. public AudioCdVolumeScanner(Platform.Common.IO.DriveInfo drive, VolumeDatabase database, AudioCdScannerOptions options) : base(drive, database, options) { if (!drive.HasAudioCdVolume) throw new ArgumentException("No audio cd present in drive"); } internal override void ScanningThreadMain(PlatformIO.DriveInfo drive, AudioCdVolume volume, BufferedVolumeItemWriter writer) { if (Options.ComputeHashs) { SendScannerWarning(S._("Hashcode generation not implemented for audio cds yet.")); volume.IsHashed = false; } AudioCdRootVolumeItem root = GetNewVolumeItem(VolumeDatabase.ID_NONE, "/", null, MetadataStore.Empty, VolumeItemType.AudioCdRootVolumeItem); LocalDisc localdisc = LocalDisc.GetFromDevice(drive.Device); if (localdisc == null) throw new ApplicationException("Could not read contents of the audio cd"); TimeSpan[] durations = localdisc.GetTrackDurations(); List items = new List(); for (int i = 0; i < durations.Length; i++) { AudioTrackVolumeItem item = GetNewVolumeItem(root.ItemID, "Track " + (i + 1), MIME_TYPE_AUDIO_TRACK, MetadataStore.Empty, VolumeItemType.AudioTrackVolumeItem); item.SetAudioTrackVolumeItemFields(durations[i]); items.Add(item); VolumeInfo.Tracks++; VolumeInfo.Duration = VolumeInfo.Duration.Add(durations[i]); } // retrieve musicbrainz metadata // (the metadata field of AudioTrackVolumeItems is set // depending on the EnableMusicBrainz flag) if (Options.EnableMusicBrainz) { try { // may throw MusicBrainzNotFoundException Release release = Release.Query(localdisc).PerfectMatch(); CheckForCancellationRequest(); if (release == null) { SendScannerWarning(S._("No MusicBrainz metadata available for this disc.")); } else { var tracks = release.GetTracks(); if (tracks.Count != items.Count) { SendScannerWarning(S._("The trackcount retrieved from MusicBrainz does not match the trackcount of the local disc. Skipped.")); } else { string albumTitle = release.GetTitle(); int releaseYear = GetReleaseYear(release); for(int i = 0; i < tracks.Count; i++) { items[i].Name = tracks[i].GetTitle(); items[i].MetaData = GetMetadata(tracks[i], albumTitle, releaseYear); } volume.Title = albumTitle; // preset category ReleaseType rtype = release.GetReleaseType(); if (rtype == ReleaseType.Album || rtype == ReleaseType.EP || rtype == ReleaseType.Compilation || rtype == ReleaseType.Remix) { volume.Category = PRESELECTED_CATEGORY; } } } } catch (MusicBrainzNotFoundException) { SendScannerWarning(S._("Error connecting to MusicBrainz server.")); } } volume.SetAudioCdVolumeFields(VolumeInfo.Tracks, VolumeInfo.Duration); // write items if (this.HasDB) { writer.Write(root); foreach (AudioTrackVolumeItem item in items) { writer.Write(item); } } } private static MetadataStore GetMetadata(Track track, string albumTitle, int releaseYear) { List metadata = new List(); if (!string.IsNullOrEmpty(albumTitle)) { metadata.Add(new MetadataItem(MetadataType.ALBUM, albumTitle)); } string artistName = track.GetArtist().GetName(); if (!string.IsNullOrEmpty(artistName)) { metadata.Add(new MetadataItem(MetadataType.ARTIST, artistName)); } string title = track.GetTitle(); if (!string.IsNullOrEmpty(title)) { metadata.Add(new MetadataItem(MetadataType.TITLE, title)); } if (releaseYear > 0) { metadata.Add(new MetadataItem(MetadataType.YEAR, releaseYear.ToString())); } if (metadata.Count == 0) return MetadataStore.Empty; else return new MetadataStore(metadata); } private static int GetReleaseYear(Release release) { int releaseYear = int.MaxValue; foreach (Event e in release.GetEvents()) { string date = e.Date; if (date != null) { try { int y = int.Parse(date.Substring(0, 4)); if (y < releaseYear) releaseYear = y; } catch {} } } return (releaseYear == int.MaxValue) ? 0 : releaseYear; } } } VolumeDB/src/VolumeScanner/IVolumeScanner.cs0000664000175000017500000000531512067326706021217 0ustar patrickpatrick// IVolumeScanner.cs // // Copyright (C) 2008 Patrick Ulbrich // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // using System; using System.Threading; namespace VolumeDB.VolumeScanner { public interface IVolumeScanner : IDisposable { // methods /// /// Begins scanning of a volume. /// The scanning main loop itself is running on a new thread, /// so this method does not block and returns immediately after initialization. /// If this VolumeScanner was instanciated with a VolumeDatabase object passed to its constructor, /// the VolumeDatabase object will be filled with the acquired information. /// On completion, the ScanCompleted event is raised. /// WaitHandle RunAsync(); /// /// Notifies the scanning thread to initiate the cancellation phase. /// If a VolumeDatabase object is associated with this VolumeScanner instance, /// the cancellation phase will involve a roll-back, reversing all changes that have been made to the database. /// The cancellation phase may take some time, depending on factors like activated hashing or buffersize. /// void CancelAsync(); // properties bool IsBusy { get; } //bool CancellationPending { get; } bool ScanSucceeded { get; } //Media Media { get ; } VolumeInfo VolumeInfo { get; } // events /// /// Raised when the next item is scanned. /// event BeforeScanItemEventHandler BeforeScanItem; /// /// Raised when an non-fatal error occurs during scanning (e.g. UnauthrizedAccessExepion, IOException). /// Scanning continues if the assigned eventhandler doesn't set args.CancelScanning to true. /// event ScannerWarningEventHandler ScannerWarning; /// /// Raised when an unhandled exception occurs on the scanning thread. /// event ErrorEventHandler Error; /// /// Raised when scanning has been completed. /// To verify whether scanning was successful, check the Error and Cancelled properties of the EventArgs object. /// event ScanCompletedEventHandler ScanCompleted; } } VolumeDB/src/VolumeScanner/FilesystemVolumeInfo.cs0000664000175000017500000000347412067326706022461 0ustar patrickpatrick// FilesystemVolumeInfo.cs // // Copyright (C) 2008 Patrick Ulbrich // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // using System; using System.Threading; namespace VolumeDB.VolumeScanner { /* * Type returned by the VolumeInfo property of the FilesystemVolumeScanner class. * It provides basic readonly info about the volume being scanned. * Properties have to be threadsafe (client may read while scanner writes)). */ public class FilesystemVolumeInfo : VolumeInfo { // FilesystemVolumeScanner does write to these properties directly (e.g. via Interlocked.Increment()) internal long files; internal long directories; internal long size; internal FilesystemVolumeInfo(FileSystemVolume v) : base(v) { this.files = v.Files; this.directories = v.Directories; this.size = v.Size; } internal override void Reset () { Interlocked.Exchange(ref files, 0); Interlocked.Exchange(ref directories, -1); // -1 : subtract root dir Interlocked.Exchange(ref size, 0); } public long Files { get { return Interlocked.Read(ref files); } } public long Directories { get { return Interlocked.Read(ref directories); } } public long Size { get { return Interlocked.Read(ref size); } } } } VolumeDB/src/VolumeScanner/AudioCdVolumeInfo.cs0000664000175000017500000000340412067326706021636 0ustar patrickpatrick// AudioCdVolumeInfo.cs // // Copyright (C) 2010 Patrick Ulbrich // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // using System; using System.Threading; namespace VolumeDB.VolumeScanner { /* * Type returned by the VolumeInfo property of the AudioCdVolumeScanner class. * It provides basic readonly info about the volume being scanned. * Properties have to be threadsafe (client may read while scanner writes)). */ public class AudioCdVolumeInfo : VolumeInfo { private volatile int tracks; private TimeSpan duration; private object duration_lock; internal AudioCdVolumeInfo(AudioCdVolume v) : base(v) { this.duration_lock = new Object(); this.tracks = v.Tracks; this.duration = v.Duration; } internal override void Reset () { Interlocked.Exchange(ref tracks, 0); lock (duration_lock) { duration = new TimeSpan(0, 0, 0); } } public int Tracks { get { return tracks; } internal set { tracks = value; } } public TimeSpan Duration { get { lock (duration_lock) { return duration; } } internal set { lock (duration_lock) { duration = value; } } } } } VolumeDB/src/VolumeScanner/FilesystemVolumeScanner.cs0000664000175000017500000006666012067326706023165 0ustar patrickpatrick// FilesystemVolumeScanner.cs // // Copyright (C) 2008 - 2011 Patrick Ulbrich // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // //#define DEBUG_FILE_VERBOSE using System; using System.IO; using System.Text; using System.Threading; using System.Security.Cryptography; using System.Collections.Generic; using System.Linq; using Platform.Common; using Platform.Common.IO; using Platform.Common.Mime; using Platform.Common.Diagnostics; using VolumeDB.Searching; using VolumeDB.Searching.ItemSearchCriteria; using VolumeDB.Metadata; namespace VolumeDB.VolumeScanner { // TODO : EnsureOpen() in public members? // TODO : override Dispose(bool) to e.g dispose/set null m_sbPathfixer? public sealed class FilesystemVolumeScanner : AbstractVolumeScanner { private const char PATH_SEPARATOR = '/'; internal const string MIME_TYPE_DIRECTORY = "x-directory/normal"; private bool disposed; //private MimeInfo mimeInfo; private StringBuilder sbPathFixer; private Paths paths; private SymLinkHelper symLinkHelper; private ThumbnailGenerator thumbGen; // note: // do not allow to modify the constuctor parameters // (i.e. database, options) // through public properties later, since the scanner // may already use them after scanning has been started, // and some stuff has been initialized depending on the // options in the ctor already. public FilesystemVolumeScanner(Platform.Common.IO.DriveInfo drive, VolumeDatabase database, FilesystemScannerOptions options) : base(drive, database, options) { if (!drive.IsMounted) throw new ArgumentException("Drive is not mounted", "drive"); if (Options.GenerateThumbnails && string.IsNullOrEmpty(Options.DbDataPath)) throw new ArgumentException("DbDataPath", "Thumbnail generation requires the DbDataPath option to be set"); disposed = false; //this.mimeInfo = new MimeInfo(false); this.sbPathFixer = new StringBuilder(1024); this.paths = new Paths(Options.DbDataPath, null, null); this.symLinkHelper = new SymLinkHelper(this); this.thumbGen = new ThumbnailGenerator(); } internal override void ScanningThreadMain(Platform.Common.IO.DriveInfo drive, FileSystemVolume volume, BufferedVolumeItemWriter writer) { try { if (Options.GenerateThumbnails) { paths.volumeDataPath = DbData.CreateVolumeDataPath(paths.dbDataPath, volume.VolumeID); paths.thumbnailPath = DbData.CreateVolumeDataThumbsPath(paths.volumeDataPath); } string rootPath = drive.RootPath; // remove possible ending path seperator except for _system_ root paths rootPath = RemoveEndingSlash(rootPath); // if ((rootPath.Length > 1) && (rootPath[rootPath.Length - 1] == Path.DirectorySeparatorChar)) // rootPath = rootPath.Substring(0, rootPath.Length - 1); // make sure the root path exists // (media may have been removed after scanner construction) if (!Directory.Exists(rootPath)) throw new DirectoryNotFoundException("Root path does not exist"); DirectoryInfo dir = new DirectoryInfo(rootPath); RecursiveDump(rootPath, dir, writer, VolumeDatabase.ID_NONE); symLinkHelper.InsertSymLinkItems(writer, volume.VolumeID); volume.SetFileSystemVolumeFields(VolumeInfo.Files, VolumeInfo.Directories, VolumeInfo.Size); } catch (Exception) { // try to cleanup try { if((paths.volumeDataPath != null) && Directory.Exists(paths.volumeDataPath)) Directory.Delete(paths.volumeDataPath, true); } catch (Exception) { /* just shut up */ } // rethrow initial exception throw; } } protected override void Reset() { //m_rootID = 0; //Media.SetFilesystemMediaFields(0, -1, 0); // -1 : subtract root dir symLinkHelper.Clear(); base.Reset(); } protected override void Dispose(bool disposing) { if (!disposed) { if (disposing) { thumbGen.Dispose(); } thumbGen = null; sbPathFixer = null; paths = null; symLinkHelper = null; } disposed = true; base.Dispose(disposing); } private void RecursiveDump(string rootPath, DirectoryInfo dir, BufferedVolumeItemWriter writer, long parentID) { CheckForCancellationRequest(); /* event is called before a _directory_ item is about to be scanned only. * it could also be called everytime a _file_ item is about to be scanned, * but this could result in a performance loss. */ PostBeforeScanItem(dir.FullName); //OnBeforeScanItem(new BeforeScanItemEventArgs(dir.FullName)); // bool dirIsSymLink = false; // string symLinkTarget = null; FileType ft; // catch possible FileNotFoundExceptions // (e.g. on filesystems with wrong filename encoding or vanishing virtual files in /dev). try { ft = FileHelper.GetFileType(dir.FullName, false); } catch (FileNotFoundException ex) { /* may throw ScanCancelledException */ SendScannerWarning(string.Format(S._("Directory '{0}' not found. (Wrong filename encoding?)"), dir.FullName), ex); return; } bool dirIsSymLink = (ft == FileType.SymbolicLink); if ((ft != FileType.Directory) && !dirIsSymLink) { /* may throw ScanCancelledException */ SendScannerWarning(string.Format(S._("Skipped item '{0}' as it doesn't seem to be a real directory."), dir.FullName)); return; } if (dirIsSymLink) { if (!Options.DiscardSymLinks) { string symLinkTarget = null; try { // get real path with all symlinks resolved symLinkTarget = FileHelper .GetCanonicalSymLinkTarget(dir.FullName); } catch (FileNotFoundException) {} // Note: // this check seems to be useless since a broken link // to a directory is identified as a broken link to a _file_ (a few lines below). if (symLinkTarget == null) { /* may throw ScanCancelledException */ SendScannerWarning(string.Format(S._("Skipped symlink item '{0}' as the target does not exist."), dir.FullName)); return; } // skip symlinks outside of rootPath // (in addition, GetLocation()/FixPath() need paths relative to rootPath) if (!symLinkTarget.StartsWith(rootPath)) { /* may throw ScanCancelledException */ SendScannerWarning(string.Format(S._("Skipped symlink item '{0}' as it appears to point to a different drive ('{1}')."), dir.FullName, symLinkTarget)); return; } symLinkHelper.AddSymLink(dir, symLinkTarget, rootPath, parentID, true); } /* do not dump symlinks to directories */ return; } /* insert dirname */ long dirID = InsertDir(rootPath, dir, writer, parentID); parentID = dirID; // TODO : check m_cancel here (?) // /* do not dump symlinks to directories */ // if (dirIsSymlink) // return; try { /* insert files of dir */ FileInfo[] files = dir.GetFiles(); /* throws access exceptions (cant access _DIRECTORY_) */ for (int i = 0; i < files.Length; i++) { CheckForCancellationRequest(); // bool isRegularFile = true; // bool isSymLink = false; //#if DEBUG && DEBUG_FILE_VERBOSE if (Global.EnableDebugging) { Debug.WriteLine(string.Format("Indexing file '{0}'", files[i].FullName)); } //#endif // catch possible FileNotFoundExceptions // (e.g. on filesystems with wrong filename encoding or vanishing virtual files in /dev). try { ft = FileHelper.GetFileType(files[i].FullName, false); } catch (FileNotFoundException ex) { /* may throw ScanCancelledException */ SendScannerWarning(string.Format(S._("File '{0}' not found. (Wrong filename encoding?)"), files[i].FullName), ex); continue; } /* special files (fifos, blockdevices, chardevices) are skipped */ bool isRegularFile = (ft == FileType.RegularFile); bool isSymLink = (ft == FileType.SymbolicLink); if (isRegularFile) { string mimeType = null; MetadataStore metaData = MetadataStore.Empty; string hash = null; bool thumbGenerated = false; FileStream fs = null; try { // OpenRead() must be called _before_ MimeInfo.GetMimeType(), // since this method returns a mimetype even if the file does not exist / can't be accessed. fs = File.OpenRead(files[i].FullName); /* throws access/IO exceptions (cant access _FILE_) */ mimeType = MimeType.GetMimeTypeForFile(files[i].FullName); if (Options.MetadataProviders != null) { IEnumerable items = null; foreach (MetadataProvider mdp in Options.MetadataProviders) { IEnumerable tmp = null; try { tmp = mdp.GetMetadata(files[i].FullName, mimeType); } catch (Exception e) { /* may throw ScanCancelledException */ SendScannerWarning(string.Format(S._("Extracting metadata from file '{0}' failed. ({1})"), files[i].FullName, e.Message), e); } if (items == null) { items = tmp; } else { if (tmp != null) items = items.Concat(tmp); } } metaData = new MetadataStore(items); } if (Options.ComputeHashs) { hash = ComputeHash(fs); // TODO : check m_cancel here? hashing can be a lengthy operation on big files. } if (Options.GenerateThumbnails) { thumbGenerated = thumbGen.GenerateThumbnail(files[i], mimeType); } } catch (Exception e) { // ### exception caught: hash, mime and/or metadata may be null // and the thumbnail may not have been generated! if (e is UnauthorizedAccessException || e is IOException) { /* may throw ScanCancelledException */ SendScannerWarning(string.Format(S._("Error opening file '{0}', can't retrieve any mime/metadata. ({1})"), files[i].FullName, e.Message), e); } else { throw; } } finally { if (fs != null) fs.Close(); } long fileID = InsertFile(rootPath, files[i], writer, parentID, mimeType, metaData, hash); if (thumbGenerated) thumbGen.SaveThumbnail(Path.Combine(paths.thumbnailPath, string.Format("{0}.png", fileID))); } else if (isSymLink) { if (!Options.DiscardSymLinks) { string symLinkTarget = null; try { // get real path with all symlinks resolved symLinkTarget = FileHelper .GetCanonicalSymLinkTarget(files[i].FullName); } catch (FileNotFoundException) {} if (symLinkTarget == null) { /* may throw ScanCancelledException */ SendScannerWarning(string.Format(S._("Skipped symlink item '{0}' as the target does not exist."), files[i].FullName)); // skip symlinks outside of rootPath // (in addition, GetLocation()/FixPath() need paths relative to rootPath) } else if (!symLinkTarget.StartsWith(rootPath)) { /* may throw ScanCancelledException */ SendScannerWarning(string.Format(S._("Skipped symlink item '{0}' as it appears to point to a different drive ('{1}')."), files[i].FullName, symLinkTarget)); // skip symlinks pointing to special files (only regular files are indexed) } else if (FileHelper.GetFileType(symLinkTarget, false) != FileType.RegularFile) { /* may throw ScanCancelledException */ SendScannerWarning(string.Format(S._("Skipped symlink item '{0}' as it does not point to a regular file ('{1}')."), files[i].FullName, symLinkTarget)); } else { symLinkHelper.AddSymLink(files[i], symLinkTarget, rootPath, parentID, false); } } } else { /* may throw ScanCancelledException */ SendScannerWarning(string.Format(S._("Skipped item '{0}' as it appears to be some kind of special file."), files[i].FullName)); } // TODO : check m_cancel here (?) } // end for /* recursively dump subdirs */ DirectoryInfo[] childDirs = dir.GetDirectories(); /* throws access exceptions (cant access _DIRECTORY_) */ for (int i = 0; i < childDirs.Length; i++) RecursiveDump(rootPath, childDirs[i], writer, parentID); } catch (UnauthorizedAccessException e) { //ScannerWarningEventArgs args = new ScannerWarningEventArgs("Unable to dump dir '" + dir.FullName + "'. (" + e.Message + ")", e); //OnScannerWarning(args); // may throw ScanCancelledException /* may throw ScanCancelledException */ SendScannerWarning(string.Format(S._("Unable to dump dir '{0}'. ({1})"), dir.FullName, e.Message), e); } } private long InsertDir(string rootPath, DirectoryInfo dir, BufferedVolumeItemWriter writer, long parentID) { /* if scanner has no db associated, just update the counters * and return */ if (!this.HasDB) { // TODO : // increase dircounter for symlink to dirs as well? // nautilus refers to selected symlinks to dirs as dirs too. Interlocked.Increment(ref VolumeInfo.directories); return VolumeDatabase.ID_NONE; } string location; string name; /* if parentID is ID_NONE, the directory is the volumes root dir * -> location = null, name = "/" (analog System.IO.DirectoryInfo) */ if (parentID == VolumeDatabase.ID_NONE) { location = null; name = PATH_SEPARATOR.ToString(); } else { location = GetLocation(dir.FullName, rootPath); name = dir.Name; } DateTime lastWriteTime = GetLastWriteTime(dir); DirectoryVolumeItem item = GetNewVolumeItem(parentID, name, MIME_TYPE_DIRECTORY, MetadataStore.Empty, VolumeItemType.DirectoryVolumeItem); item.SetFileSystemVolumeItemFields(location, lastWriteTime, VolumeDatabase.ID_NONE); //item.Name = name; // set the items name (defined on VolumeItem baseclass) // if (isSymlink) { // /* don't dump symlink dirs directly into the database, // * they're required to have a target item assigned. // * target items are resolved in an additional step. // */ // symLinkItems.add(symLinkTarget, item); // } else { writer.Write(item); // } // TODO : // increase dircounter for symlink to dirs as well? // nautilus refers to selected symlinks to dirs as dirs too. Interlocked.Increment(ref VolumeInfo.directories); if (!Options.DiscardSymLinks) symLinkHelper.AddFile(dir.FullName, item.ItemID); return item.ItemID; } private long InsertFile(string rootPath, FileInfo file, BufferedVolumeItemWriter writer, long parentID, string mimeType, MetadataStore metaData, string hash) { /* if scanner has no db associated, just update the counters * and return */ if (!this.HasDB) { Interlocked.Increment(ref VolumeInfo.files); Interlocked.Add(ref VolumeInfo.size, file.Length); return VolumeDatabase.ID_NONE; } DateTime lastWriteTime = GetLastWriteTime(file); FileVolumeItem item = GetNewVolumeItem(parentID, file.Name, mimeType, metaData, VolumeItemType.FileVolumeItem); item.SetFileSystemVolumeItemFields(GetLocation(file.FullName, rootPath), lastWriteTime, VolumeDatabase.ID_NONE); item.SetFileVolumeItemFields(file.Length, hash); //item.Name = file.Name; // set the items name (defined on VolumeItem baseclass) writer.Write(item); Interlocked.Increment(ref VolumeInfo.files); Interlocked.Add(ref VolumeInfo.size, file.Length); if (!Options.DiscardSymLinks) symLinkHelper.AddFile(file.FullName, item.ItemID); return item.ItemID; } private DateTime GetLastWriteTime(FileSystemInfo f) { DateTime lastWriteTime; // TODO : LastWriteTime fails on folders burned on CD (both, .net and mono). // If it doesn't anymore this function can be removed. try { lastWriteTime = f.LastWriteTime; } catch (ArgumentOutOfRangeException e) { lastWriteTime = DateTime.MinValue; /* may throw ScanCancelledException */ SendScannerWarning(string.Format(S._("Can't read LastWriteTime from item '{0}' ({1})."), f.FullName, e.Message)); } return lastWriteTime; } // returns the location of a file/dir and fixes DirectorySeperatorChars // NOTE: requires a path _relative_ to rootPath! private string GetLocation(string fullName, string rootPath) { // remove possible ending slash from dirs fullName = RemoveEndingSlash(fullName); // if ((fullName[fullName.Length - 1] == Path.DirectorySeparatorChar) && (fullName.Length > 1)) // fullName = fullName.Substring(0, fullName.Length - 1); // check if the path is the rootPath if (fullName.Length == rootPath.Length) return string.Empty; string dirName = Path.GetDirectoryName(fullName); return FixPath(dirName, rootPath); } // removes rootPath and fixes DirectorySeperatorChars // NOTE: requires a path _relative_ to rootPath! private string FixPath(string fullName, string rootPath) { // TODO : test under win32 and linux // remove possible ending slash from dirs fullName = RemoveEndingSlash(fullName); // if ((fullName[fullName.Length - 1] == Path.DirectorySeparatorChar) && (fullName.Length > 1)) // fullName = fullName.Substring(0, fullName.Length - 1); // check if the path is the rootPath if (fullName.Length == rootPath.Length) return PATH_SEPARATOR.ToString(); bool rootPathEqualsDirSeperator = (rootPath.Length == 1 && rootPath[0] == Path.DirectorySeparatorChar); // if path is seperated by our PATH_SEPERATOR... if (Path.DirectorySeparatorChar == PATH_SEPARATOR) { // ... just remove rootPath (if it doesn't equal the dir seperator by accident) if (!rootPathEqualsDirSeperator) fullName = fullName.Substring(rootPath.Length); #if DEBUG System.Diagnostics.Debug.Assert(fullName[0] == PATH_SEPARATOR); #endif return fullName; } else { // path is NOT seperated by our PATH_SEPERATOR... // reset stringbuilder sbPathFixer.Length = 0; // store fullname sbPathFixer.Append(fullName); // remove rootPath if (!rootPathEqualsDirSeperator) { sbPathFixer.Remove(0, rootPath.Length); sbPathFixer.Insert(0, PATH_SEPARATOR); } // replace platform dependent DirectorySeparatorChar by PATH_SEPERATOR sbPathFixer.Replace(Path.DirectorySeparatorChar, PATH_SEPARATOR); #if DEBUG string s = sbPathFixer.ToString(); System.Diagnostics.Debug.Assert(s[0] == PATH_SEPARATOR); System.Diagnostics.Debug.Assert(s.IndexOf(Path.DirectorySeparatorChar) == -1); return s; #else return sbPathFixer.ToString(); #endif } } private static string RemoveEndingSlash(string path) { // remove ending path separator from dirs, // except for _system_ root paths ("/" on unix, "C:\", "D:\", ... on windows) // (esp. important on windows as e.g. "D:" won't work with DirectoryInfo) if ((path[path.Length - 1] == Path.DirectorySeparatorChar) && (path != Path.GetPathRoot(path))) return path.Substring(0, path.Length - 1); else return path; } private static string ComputeHash(Stream s) { StringBuilder sb = new StringBuilder(); // TODO : define at class level like sbPathFixer? //using (FileStream fs = File.OpenRead(filePath)) { MD5CryptoServiceProvider md5 = new MD5CryptoServiceProvider(); byte[] hash = md5.ComputeHash(s); foreach (byte b in hash) sb.Append(b.ToString("X2")); //} return sb.ToString(); } #region SymLinkHelper class private class SymLinkHelper { private FilesystemVolumeScanner scanner; private Dictionary files; private List symLinkItems; public SymLinkHelper(FilesystemVolumeScanner scanner) { this.scanner = scanner; this.files = new Dictionary(); this.symLinkItems = new List(); } public void AddFile(string path, long id) { files.Add(path, id); } public void AddSymLink(FileSystemInfo symLink, string fullTargetPath, string rootPath, long parentID, bool isDir) { SymLinkItem s = new SymLinkItem(); s.parentID = parentID; s.name = symLink.Name; s.location = scanner.GetLocation(symLink.FullName, rootPath); s.fullPath = symLink.FullName; s.fullTargetPath = fullTargetPath; s.isDir = isDir; symLinkItems.Add(s); } public void Clear() { files.Clear(); symLinkItems.Clear(); } public void InsertSymLinkItems(BufferedVolumeItemWriter writer, long volumeID) { if (symLinkItems.Count == 0) return; /* if scanner has no db associated, just update the counters * and return */ if (!scanner.HasDB) { foreach(SymLinkItem sli in symLinkItems) { if (sli.isDir) Interlocked.Increment(ref scanner.VolumeInfo.directories); else Interlocked.Increment(ref scanner.VolumeInfo.files); // TODO : // increase totalsize by size of symlinks too? (not size of target!) // or are symlinks as big as dirs, those aren't respected as well.. //Interlocked.Add(ref VolumeInfo.size, sli.size); } return; } // make sure all files/dirs have been written to the database // before searching for symlink targets. writer.Flush(); foreach (SymLinkItem sli in symLinkItems) { scanner.CheckForCancellationRequest(); long itemID; if (!files.TryGetValue(sli.fullTargetPath, out itemID)) { /* may throw ScanCancelledException */ scanner.SendScannerWarning(string.Format(S._("Failed to resolve target item for symlink '{0}'."), sli.fullPath)); } else { SearchCriteriaGroup g = new SearchCriteriaGroup(MatchRule.AllMustMatch); g.AddSearchCriteria(new IDSearchCriteria(volumeID, IDSearchField.VolumeID, CompareOperator.Equal)); g.AddSearchCriteria(new IDSearchCriteria(itemID, IDSearchField.ItemID, CompareOperator.Equal)); // query target item. // async BeginItemSearch() won't work here // (active transaction prevents other threads from accessing the database) VolumeItem[] queriedItems = scanner.Database.SearchItem(g); FileSystemVolumeItem targetItem = (FileSystemVolumeItem)queriedItems[0]; FileSystemVolumeItem newItem; if (targetItem is FileVolumeItem) { newItem = scanner.GetNewVolumeItem(sli.parentID, sli.name, targetItem.MimeType, targetItem.MetaData, VolumeItemType.FileVolumeItem); ((FileVolumeItem)newItem).SetFileVolumeItemFields( ((FileVolumeItem)targetItem).Size, ((FileVolumeItem)targetItem).Hash); Interlocked.Increment(ref scanner.VolumeInfo.files); } else { // DirectoryVolumeItem newItem = scanner.GetNewVolumeItem(sli.parentID, sli.name, targetItem.MimeType, targetItem.MetaData, VolumeItemType.DirectoryVolumeItem); Interlocked.Increment(ref scanner.VolumeInfo.directories); } newItem.SetFileSystemVolumeItemFields(sli.location, targetItem.LastWriteTime, targetItem.ItemID); writer.Write(newItem); // TODO : // increase totalsize by size of symlinks too? (not size of target!) // or are symlinks as big as dirs, those aren't respected as well.. //Interlocked.Add(ref VolumeInfo.size, sli.size); if (Global.EnableDebugging) { Debug.WriteLine("Successfully resolved and saved symlink item: {0}/{1} -> {2}/{3}", (sli.location == PATH_SEPARATOR.ToString() ? "" : sli.location), sli.name, (targetItem.Location == PATH_SEPARATOR.ToString() ? "" : targetItem.Location), (targetItem.Name == PATH_SEPARATOR.ToString() ? "" : targetItem.Name)); } } // end if } // end foreach } private class SymLinkItem { public long parentID; public string name; public string location; public string fullPath; public string fullTargetPath; public bool isDir; } } #endregion private class Paths { public string dbDataPath; public string volumeDataPath; public string thumbnailPath; public Paths(string dbDataPath, string volumeDataPath, string thumbnailPath) { this.dbDataPath = dbDataPath; this.volumeDataPath = volumeDataPath; this.thumbnailPath = thumbnailPath; } } } } VolumeDB/src/IVolumeDBRecord.cs0000664000175000017500000000260312067326706016466 0ustar patrickpatrick// IVolumeDBRecord.cs // // Copyright (C) 2008 Patrick Ulbrich // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // using System; using System.Collections.Generic; namespace VolumeDB { /// /// Internal interface to hide members ment to be called by VolumeDatabase reader/writer methods exclusively. /// Must be implemented explicitely, for member hiding to take effect. /// internal interface IVolumeDBRecord { string TableName { get; } string[] PrimaryKeyFields { get; } // in particular this property must not be visible by default // (altering this property would break VolumeDatabase.InsertMedia()/Item() and VolumeDatabase.UpdateMedia()/Item()) bool IsNew { get; set; } IRecordData GetRecordData(); void SetRecordData(IRecordData recordData); } } VolumeDB/src/FieldnameValuePair.cs0000664000175000017500000000210212067326706017230 0ustar patrickpatrick// FieldnameValuePair.cs // // Copyright (C) 2008 Patrick Ulbrich // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // using System; namespace VolumeDB { internal struct FieldnameValuePair { private string fieldName; private object value; public FieldnameValuePair(string fieldName, object value) { this.fieldName = fieldName; this.value = value; } public string Fieldname { get { return fieldName; } } public object Value { get { return value; } } } } VolumeDB/src/IHashable.cs0000664000175000017500000000157012067326706015363 0ustar patrickpatrick// IHashable.cs // // Copyright (C) 2008 Patrick Ulbrich // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // using System; namespace VolumeDB { /// /// Interface for VolumeItems that can be hashed. /// public interface IHashable { string Hash { get; } } } VolumeDB/src/VolumeDatabase.SqlBackend.cs0000664000175000017500000002544412067326706020453 0ustar patrickpatrick// VolumeDatabase.SqlBackend.cs // // Copyright (C) 2008 Patrick Ulbrich // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // using System; using System.Collections; using System.Collections.Generic; using System.Data; using System.Threading; using Platform.Common.DB; namespace VolumeDB { public sealed partial class VolumeDatabase : IDisposable { private class SqlBackend : IDisposable { // Time in ms a thread should try to acquire the lock to the database connection // before throwing a timeout exception. // Keep in mind that e.g. search methods may take a few seconds // and that other threads may already be waiting in the ready queue. private const int CONN_LOCK_TIMEOUT = 10 * 1000; private bool disposed; private IDbConnection conn; private object _conn_lock; // used by Monitor.TryEnter() to lock a VolumeDatabase instance (e.g. sqlite is singlethreaded) private IDbTransaction transaction; // current transaction private Thread currentTransactionThread; // thread that is currently performing a transaction private VolumeDatabase ownerDb; // reference to the owner volumedatabe object public SqlBackend(string dbPath, bool create, VolumeDatabase ownerDb) { _conn_lock = new Object(); conn = SqliteDB.Open(dbPath, create); disposed = false; transaction = null; currentTransactionThread = null; this.ownerDb = ownerDb; } // executes a single sql query. public void ExecuteNonQuery(string sqlCommand) { //ExecuteNonQuery(new string[] { sqlCommand }); EnsureOpen(); IDbCommand cmd = null; EnterConnectionLock(); try { try { ownerDb.OnBeginWriteAccess(new EventArgs()); cmd = conn.CreateCommand(); cmd.Transaction = transaction; cmd.CommandText = sqlCommand; cmd.ExecuteNonQuery(); } finally { if (cmd != null) cmd.Dispose(); ownerDb.OnEndWriteAccess(new EventArgs()); } } finally { ExitConnectionLock(); } } // executes multiple sql queries // encapsulated in a new transaction if there isn't an open transaction already. public void ExecuteNonQuery(string[] sqlCommandBatch) { EnsureOpen(); /* IDbCommand cmd = null; // TODO : command auf klassenebene? NEIN! Ist jetzt multithreadsave! EnterConnectionLock(); try { try { OnBeginWriteAccess(new EventArgs()); cmd = conn.CreateCommand(); cmd.Transaction = transaction; for (int i = 0; i < sqlCommandBatch.Length; i++) { cmd.CommandText = sqlCommandBatch[i]; cmd.ExecuteNonQuery(); } } finally { if (cmd != null) cmd.Dispose(); OnEndWriteAccess(new EventArgs()); } } finally { ExitConnectionLock(); } */ IDbCommand cmd = null; bool localTransaction = false; if (!CurrentThreadHasStartedTransaction) { TransactionBegin(); // calls EnterConnectionLock() localTransaction = true; } try { ownerDb.OnBeginWriteAccess(new EventArgs()); cmd = conn.CreateCommand(); cmd.Transaction = transaction; for (int i = 0; i < sqlCommandBatch.Length; i++) { cmd.CommandText = sqlCommandBatch[i]; cmd.ExecuteNonQuery(); } if (localTransaction) TransactionCommit(); // calls ExitConnectionLock() } catch(Exception) { if (localTransaction) TransactionRollback(); // calls ExitConnectionLock() throw; } finally { if (cmd != null) cmd.Dispose(); ownerDb.OnEndWriteAccess(new EventArgs()); } } public object ExecuteScalar(string sqlCommand) { EnsureOpen(); EnterConnectionLock(); try { //try { // TODO: in case OnBeginReadAccess() will be uncommented: remove using block and use this try block (as in ExecuteNonQuery(string)) //OnBeginReadAccess(new EventArgs()); using (IDbCommand cmd = conn.CreateCommand()) { cmd.CommandText = sqlCommand; cmd.Transaction = transaction; return cmd.ExecuteScalar(); } //} finally { // OnEndReadAccess(new EventArgs()); //} } finally { ExitConnectionLock(); } } public delegate void ExecuteReaderCallback(IDataReader reader, IRecordData readerRecData); public void ExecuteReader(string sqlCommand, ExecuteReaderCallback callback) { EnsureOpen(); EnterConnectionLock(); try { IDbCommand cmd = null; IDataReader reader = null; try { // OnBeginReadAccess(new EventArgs()); cmd = conn.CreateCommand(); cmd.CommandText = sqlCommand; cmd.Transaction = transaction; reader = cmd.ExecuteReader(); IRecordData readerRecData = new RecordData_DataReader_Wrapper(reader); callback(reader, readerRecData); } finally { if (reader != null) reader.Dispose(); if (cmd != null) cmd.Dispose(); // OnEndReadAccess(new EventArgs()); } } finally { ExitConnectionLock(); } } /* * transactions */ /// ///Begins a transaction on the current thread. ///Other threads are blocked from accessing the database until this thread calls TransactionCommit() or TransactionRollback(). ///Callers of this method must make sure that TransactionRollback() is called whenever an exception occurs in succeeding mehtod calls on the same SqlBackend instance. ///Ignoring exceptions of SqlBackend methods during an active transaction can lead to loss of/inconsistent data. /// public void TransactionBegin() { EnsureOpen(); if (CurrentThreadHasStartedTransaction) // nested transactions are not supported by most database systems throw new InvalidOperationException("The current thread has already started a transaction"); // other threads cannot write to conn during an active transaction (their writes will have no effect (in case of a sqliteconnection, without notice!)) // so lock them out during a transaction. EnterConnectionLock(); try { transaction = conn.BeginTransaction(); currentTransactionThread = Thread.CurrentThread; } catch(Exception) { transaction = null; currentTransactionThread = null; ExitConnectionLock(); throw; } } /// ///Commits the transaction of the current thread. /// public void TransactionCommit() { EnsureOpen(); if (!CurrentThreadHasStartedTransaction) throw new InvalidOperationException("The current thread has not started a transaction"); try { transaction.Commit(); } finally { transaction = null; currentTransactionThread = null; ExitConnectionLock(); } } /// ///Rolls back the transaction of the current thread. /// public void TransactionRollback() { EnsureOpen(); if (!CurrentThreadHasStartedTransaction) throw new InvalidOperationException("The current thread has not started a transaction"); try { transaction.Rollback(); } finally { transaction = null; currentTransactionThread = null; ExitConnectionLock(); } } private bool CurrentThreadHasStartedTransaction { get { return Thread.CurrentThread == currentTransactionThread; } } /* * mutlithreading support functions */ public void EnterConnectionLock() { EnsureOpen(); if (!Monitor.TryEnter(_conn_lock, CONN_LOCK_TIMEOUT)) throw new TimeoutException("Another thread is busy accessing the database"); } public void ExitConnectionLock() { EnsureOpen(); Monitor.Exit(_conn_lock); } public void Close() { Dispose(true); } public bool IsClosed { get { return disposed; } } #region IDisposable Members void IDisposable.Dispose() { Dispose(true); } #endregion private void Dispose(bool disposing) { if (!disposed) { if (disposing) { if (conn.State == ConnectionState.Open) conn.Close(); } conn = null; transaction = null; currentTransactionThread = null; _conn_lock = null; } disposed = true; } private void EnsureOpen() { if (disposed) throw new ObjectDisposedException("SqlConn"); } #region nested class RecordData_DataReader_Wrapper private class RecordData_DataReader_Wrapper : IRecordData { private IDataReader reader; private string fieldNamePrefix; public RecordData_DataReader_Wrapper(IDataReader reader) : this(reader, null) { } public RecordData_DataReader_Wrapper(IDataReader reader, string fieldNamePrefix) { this.reader = reader; this.fieldNamePrefix = fieldNamePrefix; } public IDataReader Reader { get { return reader; } set { reader = value; } } public string FieldNamePrefix { get { return fieldNamePrefix ?? string.Empty; } set { fieldNamePrefix = value; } } #region IRecordData Members public object this[string fieldName] { get { if (fieldNamePrefix == null || fieldNamePrefix.Length == 0) return reader[fieldName]; return reader[fieldNamePrefix + fieldName]; } } public object GetValue(string fieldName) { if (fieldNamePrefix == null || fieldNamePrefix.Length == 0) return reader[fieldName]; return reader[fieldNamePrefix + fieldName]; } public void AddField(string fieldName, object value) { throw new NotSupportedException(); } #endregion #region IEnumerable Members IEnumerator IEnumerable.GetEnumerator() { for (int i = 0; i < reader.FieldCount; i++) { string fieldName = reader.GetName(i); object value = reader.GetValue(i); if (fieldNamePrefix != null && fieldNamePrefix.Length > 0) fieldName = fieldName.Substring(fieldNamePrefix.Length); FieldnameValuePair pair = new FieldnameValuePair(fieldName, value); yield return pair; } } #endregion #region IEnumerable Members IEnumerator IEnumerable.GetEnumerator() { return ((IEnumerable)this).GetEnumerator(); } #endregion } #endregion } } }VolumeDB/src/FileSystemVolumeItem.cs0000664000175000017500000001146712067326706017644 0ustar patrickpatrick// FileSystemVolumeItem.cs // // Copyright (C) 2008 Patrick Ulbrich // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // using System; namespace VolumeDB { public abstract class FileSystemVolumeItem : VolumeItem { /* * Support for CreationTime was dropped for the following reasons: * - Unix Filesystems don't have a CreationTime. * - It seems that the CreationTime of files burned onto ISO9660/Joliet disks * becomes the LastWriteTime. * Since Basenji/VolumeDB is mainly designed for CD-ROM indexing, * there is not much sense in supporting a timestamp that returns false * information on such volumes. */ internal const int MAX_LOCATION_LENGTH = 4096; private string location; //private DateTime createdDate; private DateTime lastWriteTime; private long symLinkTargetID; internal FileSystemVolumeItem(VolumeDatabase database, VolumeItemType volumeItemType) : base(database, volumeItemType) { this.location = null; //this.createdDate = DateTime.MinValue; this.lastWriteTime = DateTime.MinValue; this.symLinkTargetID = VolumeDatabase.ID_NONE; } /// /// Required by internal factory methods like AbstractVolumeScanner.GetNewVolumeItem() /// Purpose : /// /// - guarantee that _all_ fields of this type are initialized by the caller /// (in contrast to property initialization, which easily makes you miss a property [in particular if a new one was added..]) /// /// /// - seperate fields of a type from fields of its base type (e.g. GetNewVolumeItem() initializes all fields of a the VolumeItem base type. /// Caller code only needs to initialize fields of the derived type) /// /// internal void SetFileSystemVolumeItemFields(string location, DateTime lastWriteTime, long symLinkTargetID) { //ValidatePath(path); this.location = location; //this.createdDate = createdDate; this.lastWriteTime = lastWriteTime; this.symLinkTargetID = symLinkTargetID; } //private static void ValidatePath(string path) //{ // if (path == null) // throw new ArgumentNullException("path"); // if (path.Length == 0) // throw new ArgumentException("path is emtpy"); //} internal override void ReadFromVolumeDBRecord(IRecordData recordData) { base.ReadFromVolumeDBRecord(recordData); location = Util.ReplaceDBNull( recordData["Location"], null); /* root item doesnt have a location */ //createdDate = Util.ReplaceDBNull( recordData["CreatedDate"], DateTime.MinValue); lastWriteTime = Util.ReplaceDBNull( recordData["LastWriteTime"], DateTime.MinValue); symLinkTargetID = (long) recordData["SymLinkTargetID"]; } internal override void WriteToVolumeDBRecord(IRecordData recordData) { base.WriteToVolumeDBRecord(recordData); recordData.AddField("Location", location); //recordData.AddField("CreatedDate", m_createdDate); recordData.AddField("LastWriteTime", lastWriteTime); //recordData.AddField("SymLinkTargetID", symLinkTargetID < -1 ? -1 : symLinkTargetID); recordData.AddField("SymLinkTargetID", symLinkTargetID); } #region read-only properties public string Location { get { return location ?? string.Empty; } internal set { location = value; } } //public DateTime CreatedDate //{ // get { return m_createdDate; } // internal set { m_createdDate = value; } //} public DateTime LastWriteTime { get { return lastWriteTime; } internal set { lastWriteTime = value; } } public bool IsSymLink { //get { return symLinkTargetID > -1; } get { return symLinkTargetID != VolumeDatabase.ID_NONE; } } #endregion #region internal properties internal long SymLinkTargetID { get { return symLinkTargetID; } set { symLinkTargetID = value; } } #endregion public FileSystemVolumeItem GetSymLinkTargetItem() { if (!IsSymLink) throw new InvalidOperationException("This item is not a symlink"); return (FileSystemVolumeItem)Database.GetVolumeItem(VolumeID, symLinkTargetID); } /* public new FileSystemVolume OwnerVolume { get { return ((FilesystemVolume)base.OwnerVolume); } } */ } } VolumeDB/src/FileSystemVolume.cs0000664000175000017500000000540712067326706017022 0ustar patrickpatrick// FileSystemVolume.cs // // Copyright (C) 2008 Patrick Ulbrich // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // using System; namespace VolumeDB { public sealed class FileSystemVolume : Volume { private long files; private long dirs; private long size; internal FileSystemVolume(VolumeDatabase database) : base(database, VolumeType.FileSystemVolume) { this.files = 0L; this.dirs = 0L; this.size = 0L; } /// /// Required by internal factory methods like AbstractVolumeScanner.CreateVolumeObject() /// Purpose : /// /// - guarantee that _all_ fields of this type are initialized by the caller /// (in contrast to property initialization, which easily makes you miss a property [in particular if a new one was added..]) /// /// /// - seperate fields of a type from fields of its base type (e.g. AbstractVolumeScanner.CreateVolumeObject() initializes all fields of a the Volume base type. /// Caller code only needs to initialize fields of the derived Volume type) /// /// internal void SetFileSystemVolumeFields(long files, long dirs, long size) { this.files = files; this.dirs = dirs; this.size = size; } // FileSystemVolume specific implementation of Volume.GetRoot() public new DirectoryVolumeItem GetRoot() { return (DirectoryVolumeItem)base.GetRoot(); } internal override void ReadFromVolumeDBRecord(IRecordData recordData) { base.ReadFromVolumeDBRecord(recordData); files = (long)recordData["Files"]; dirs = (long)recordData["Dirs"]; size = (long)recordData["Size"]; } internal override void WriteToVolumeDBRecord(IRecordData recordData) { base.WriteToVolumeDBRecord(recordData); recordData.AddField("Files", files); recordData.AddField("Dirs", dirs); recordData.AddField("Size", size); } #region read-only properties public long Files { get { return files; } internal set { files = value; } } public long Directories { get { return dirs; } internal set { dirs = value; } } public long Size { get { return size; } internal set { size = value; } } #endregion } } VolumeDB/src/DecoderUtility.cs0000664000175000017500000000576112067326706016502 0ustar patrickpatrick// DecoderUtility.cs // // Copyright (C) 2005 Novell, Inc (http://www.novell.com) // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // // sourcecode copies from the mono sources (System.Web.HttpUtility) using System; using System.IO; using System.Text; namespace VolumeDB { internal static class DecoderUtility { // decodes a quoted-printable encoded string public static string UrlDecode (string s, Encoding e) { if (null == s) return null; if (s.IndexOf ('%') == -1 && s.IndexOf ('+') == -1) return s; if (e == null) e = Encoding.UTF8; StringBuilder output = new StringBuilder (); long len = s.Length; MemoryStream bytes = new MemoryStream (); int xchar; for (int i = 0; i < len; i++) { if (s [i] == '%' && i + 2 < len && s [i + 1] != '%') { if (s [i + 1] == 'u' && i + 5 < len) { if (bytes.Length > 0) { output.Append (GetChars (bytes, e)); bytes.SetLength (0); } xchar = GetChar (s, i + 2, 4); if (xchar != -1) { output.Append ((char) xchar); i += 5; } else { output.Append ('%'); } } else if ((xchar = GetChar (s, i + 1, 2)) != -1) { bytes.WriteByte ((byte) xchar); i += 2; } else { output.Append ('%'); } continue; } if (bytes.Length > 0) { output.Append (GetChars (bytes, e)); bytes.SetLength (0); } if (s [i] == '+') { output.Append (' '); } else { output.Append (s [i]); } } if (bytes.Length > 0) { output.Append (GetChars (bytes, e)); } bytes = null; return output.ToString (); } public static string UrlDecode (string str) { return UrlDecode(str, Encoding.UTF8); } private static char [] GetChars (MemoryStream b, Encoding e) { return e.GetChars (b.GetBuffer (), 0, (int) b.Length); } private static int GetChar (string str, int offset, int length) { int val = 0; int end = length + offset; for (int i = offset; i < end; i++) { char c = str [i]; if (c > 127) return -1; int current = GetInt ((byte) c); if (current == -1) return -1; val = (val << 4) + current; } return val; } private static int GetInt (byte b) { char c = (char) b; if (c >= '0' && c <= '9') return c - '0'; if (c >= 'a' && c <= 'f') return c - 'a' + 10; if (c >= 'A' && c <= 'F') return c - 'A' + 10; return -1; } } } VolumeDB/src/ExtensionMethods.cs0000664000175000017500000000307512067326706017045 0ustar patrickpatrick// ExtensionMethods.cs // // Copyright (C) 2012 Patrick Ulbrich // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // using System; namespace VolumeDB { public static class ExtensionMethods { public static VolumeDriveType ToVolumeDriveType (this Platform.Common.IO.DriveType driveType) { VolumeDriveType vdt; switch (driveType) { case Platform.Common.IO.DriveType.CDRom: vdt = VolumeDriveType.CDRom; break; case Platform.Common.IO.DriveType.Fixed: vdt = VolumeDriveType.Harddisk; break; case Platform.Common.IO.DriveType.Ram: vdt = VolumeDriveType.Ram; break; case Platform.Common.IO.DriveType.Network: vdt = VolumeDriveType.Network; break; case Platform.Common.IO.DriveType.Removable: vdt = VolumeDriveType.Removable; break; case Platform.Common.IO.DriveType.Unknown: vdt = VolumeDriveType.Unknown; break; default: throw new Exception("Invalid DriveType"); } return vdt; } } } VolumeDB/src/Metadata/0000775000175000017500000000000012067326706014731 5ustar patrickpatrickVolumeDB/src/Metadata/TagLibMetadataProvider.cs0000664000175000017500000002213612067326706021602 0ustar patrickpatrick// TagLibMetadataProvider.cs // // Copyright (C) 2011, 2012 Patrick Ulbrich // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // using System; using System.Text; using System.Collections.Generic; using System.Globalization; using Platform.Common.Diagnostics; using TagLib; namespace VolumeDB.Metadata { public sealed class TagLibMetadataProvider : MetadataProvider { // enable detailed debugging messages private const bool VERBOSE = true; // orientation strings used by libextractor 0.5.x, too private readonly Dictionary orientations = new Dictionary() { { TagLib.Image.ImageOrientation.BottomLeft, "bottom, left" }, { TagLib.Image.ImageOrientation.BottomRight, "bottom, right" }, { TagLib.Image.ImageOrientation.LeftBottom, "left, bottom" }, { TagLib.Image.ImageOrientation.LeftTop, "left, top" }, { TagLib.Image.ImageOrientation.RightBottom, "right, bottom" }, { TagLib.Image.ImageOrientation.RightTop, "right, top" }, { TagLib.Image.ImageOrientation.TopLeft, "top, left" }, { TagLib.Image.ImageOrientation.TopRight, "top, right" } }; private static string[] formatTypes = new string[] { "Video", "Audio", "Image" }; private static readonly NumberFormatInfo numformat = CultureInfo.InvariantCulture.NumberFormat; public TagLibMetadataProvider () { } public override IEnumerable GetMetadata(string filename, string mimetype) { EnsureNotDisposed(); if ((mimetype != null) && !FileTypes.AvailableTypes.ContainsKey(mimetype)) { if (VERBOSE && Global.EnableDebugging) Debug.WriteLine("taglib# does not like files of type " + mimetype); return null; } TagLib.File f; try { f = File.Create(filename, mimetype, ReadStyle.Average); // null mimetype allowed } catch (UnsupportedFormatException) { if (VERBOSE && Global.EnableDebugging) Debug.WriteLine("taglib# does not like files of type " + mimetype); return null; } catch (CorruptFileException) { if (VERBOSE && Global.EnableDebugging) Debug.WriteLine(string.Format("taglib# says file '{0}' is broken.", filename)); throw; // make the scanner output the error // return null; } List metadata = new List(); AddGenericTags(metadata, f); AddCustomTags(metadata, f); AddProperties(metadata, f); if (metadata.Count == 0) return null; return metadata; } private static void AddGenericTags(List metadata, TagLib.File f) { if (!AddData(metadata, MetadataType.ARTIST, f.Tag.JoinedPerformers)) AddData(metadata, MetadataType.ARTIST, f.Tag.JoinedAlbumArtists); if (f.Tag.Year > 0) AddData(metadata, MetadataType.YEAR, f.Tag.Year.ToString()); AddData(metadata, MetadataType.ALBUM, f.Tag.Album); AddData(metadata, MetadataType.TITLE, f.Tag.Title); AddData(metadata, MetadataType.GENRE, f.Tag.JoinedGenres); AddData(metadata, MetadataType.COPYRIGHT, f.Tag.Copyright); AddData(metadata, MetadataType.COMMENT, f.Tag.Comment); AddData(metadata, MetadataType.LYRICS, f.Tag.Lyrics); } private void AddCustomTags(List metadata, TagLib.File f) { // if the file is an image, extract image specific tags. // all metadata should use the libextractor 0.5.x format in order to // preserve compatibility. if (f is TagLib.Image.File) { TagLib.Image.ImageTag tag = (TagLib.Image.ImageTag)f.Tag; AddData(metadata, MetadataType.CAMERA_MAKE, tag.Make); AddData(metadata, MetadataType.CAMERA_MODEL, tag.Model); AddData(metadata, MetadataType.CREATOR, tag.Creator); //AddData(metadata, MetadataType.SOFTWARE, tag.Software); // returns "1.0" for pictures !? if (tag.DateTime.HasValue) AddData(metadata, MetadataType.DATE, tag.DateTime.Value.ToString("yyyy:MM:dd HH:mm:ss")); // ":" in date intended // exposure times are generally very short, // so allow at least 3 decimal places if (tag.ExposureTime.HasValue) AddData(metadata, MetadataType.EXPOSURE, tag.ExposureTime.Value.ToString("#0.000 s", numformat)); if (tag.FocalLength.HasValue) AddData(metadata, MetadataType.FOCAL_LENGTH, tag.FocalLength.Value.ToString("#0.0 mm", numformat)); if (tag.FocalLengthIn35mmFilm.HasValue) AddData(metadata, MetadataType.FOCAL_LENGTH_35MM, tag.FocalLengthIn35mmFilm.Value.ToString("#0.0 mm", numformat)); if (tag.Orientation != TagLib.Image.ImageOrientation.None) AddData(metadata, MetadataType.ORIENTATION, orientations[tag.Orientation]); if (tag.ISOSpeedRatings.HasValue) AddData(metadata, MetadataType.ISO_SPEED, tag.ISOSpeedRatings.Value.ToString()); } } private static void AddProperties(List metadata, TagLib.File f) { if (f.Properties == null) return; if (f.Properties.MediaTypes != MediaTypes.None) { TimeSpan duration = f.Properties.Duration; if (duration.Ticks > 0) { AddData(metadata, MetadataType.DURATION, MetadataUtils.SecsToMetadataDuration(duration.TotalSeconds)); } } string[] formats = new string[3]; int fmtCount = 0; int w = int.MinValue, h = int.MinValue; int q = int.MinValue; foreach (ICodec codec in f.Properties.Codecs) { if ((codec.MediaTypes & MediaTypes.Video) == TagLib.MediaTypes.Video) { IVideoCodec vcodec = codec as IVideoCodec; w = vcodec.VideoWidth; h = vcodec.VideoHeight; if (HasValidData(vcodec.Description)) { formats[0] = vcodec.Description; fmtCount++; } } if ((codec.MediaTypes & MediaTypes.Audio) == TagLib.MediaTypes.Audio) { IAudioCodec acodec = codec as IAudioCodec; if (HasValidData(acodec.Description)) { StringBuilder fmt = new StringBuilder(); fmt.Append(acodec.Description); if (acodec.AudioBitrate > 0) { if (fmt.Length > 0) fmt.Append(", "); fmt.Append(acodec.AudioBitrate.ToString()).Append(" kb/s"); } if (acodec.AudioChannels > 0) { if (fmt.Length > 0) fmt.Append(", "); fmt.Append(acodec.AudioChannels.ToString()).Append(" channels"); } if (acodec.AudioSampleRate > 0) { if (fmt.Length > 0) fmt.Append(", "); fmt.Append(acodec.AudioSampleRate.ToString()).Append(" Hz"); } if (fmt.Length > 0) { formats[1] = fmt.ToString(); fmtCount++; } } } if ((codec.MediaTypes & MediaTypes.Photo) == TagLib.MediaTypes.Photo) { IPhotoCodec pcodec = codec as IPhotoCodec; // don't overwrite video dimensions if ((w == int.MinValue) && (h == int.MinValue)) { w = pcodec.PhotoWidth; h = pcodec.PhotoHeight; } q = pcodec.PhotoQuality; if (HasValidData(pcodec.Description)) { formats[2] = pcodec.Description; fmtCount++; } } } // size format of libextrator is NxN if ((w > int.MinValue) && (h > int.MinValue)) AddData(metadata, MetadataType.SIZE, string.Format("{0}x{1}", w, h)); if (q > int.MinValue) AddData(metadata, MetadataType.IMAGE_QUALITY, q.ToString()); // build format string StringBuilder sb = new StringBuilder(); for (int i = 0; i < formats.Length; i++) { string s = formats[i]; if (s == null) continue; if (sb.Length > 0) sb.Append ("; "); if (fmtCount > 1) sb.AppendFormat("{0}: {1}", formatTypes[i], s); else sb.Append(s); } if (sb.Length > 0) AddData(metadata, MetadataType.FORMAT, sb.ToString()); } private static bool AddData(List metadata, MetadataType type, string data) { if (!HasValidData(data)) return false; // TODO : workaround for bug #1084428 // remove this if the bug has been fixed upstream // in taglib#. if (data[data.Length - 1] == '\0') data = data.Substring(0, data.Length -1); metadata.Add(new MetadataItem(type, data)); if (VERBOSE && Global.EnableDebugging) Debug.WriteLine(string.Format("Got new metadata from taglib#: {0} - {1}", type, data)); return true; } private static bool HasValidData(string s) { if (string.IsNullOrEmpty(s)) return false; bool allWhite = true; for (int i = 0; i < s.Length; i++) { if (!char.IsWhiteSpace(s[i])) { allWhite = false; break; } } return !allWhite; } } } VolumeDB/src/Metadata/ArchiveMetadataProvider.cs0000664000175000017500000000776112067326706022030 0ustar patrickpatrick// ArchiveMetadataProvider.cs // // Copyright (C) 2011 Patrick Ulbrich // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // using System; using System.Collections.Generic; using System.IO; using ICSharpCode.SharpZipLib.Zip; using ICSharpCode.SharpZipLib.Tar; using ICSharpCode.SharpZipLib.GZip; using ICSharpCode.SharpZipLib.BZip2; using Platform.Common.Diagnostics; namespace VolumeDB.Metadata { public sealed class ArchiveMetadataProvider : MetadataProvider { // enable detailed debugging messages private const bool VERBOSE = true; private delegate void ArchiveMetadataDelegate(string filename, List metadata); // TODO : add support for more archive formats, e.g. RAR private readonly Dictionary supportedArchiveTypes = new Dictionary() { { "application/zip", GetZipMetadata }, { "application/x-zip-compressed", GetZipMetadata }, { "application/x-java-archive", GetZipMetadata }, { "application/x-tar", GetUncompressedTarMetadata }, { "application/x-compressed-tar", GetCompressedTarMetadata }, { "application/x-bzip-compressed-tar", GetBZipCompressedTarMetadata } }; public ArchiveMetadataProvider () { } public override IEnumerable GetMetadata(string filename, string mimetype) { EnsureNotDisposed(); ArchiveMetadataDelegate GetMetadata; if ((mimetype == null) || !supportedArchiveTypes.TryGetValue(mimetype, out GetMetadata)) { if (VERBOSE && Global.EnableDebugging) { if (mimetype == null) Debug.WriteLine("ArchiveMetadataProvider got a Mimetype nullptr"); else Debug.WriteLine("ArchiveMetadataProvider does not like files of type " + mimetype); } return null; } // only instanciate the list after ensuring that the mimetype is actually supported. // save resourecs -> GetMetadata() is called on every single file. List metadata = new List(); GetMetadata(filename, metadata); if (metadata.Count == 0) return null; return metadata; } // may throw ZipException, e.g. on password protected files private static void GetZipMetadata(string filename, List metadata) { using (ZipInputStream s = new ZipInputStream(File.OpenRead(filename))) { ZipEntry e; while ((e = s.GetNextEntry()) != null) { if (e.IsFile || e.IsDirectory) { // Note: directories can be identified by a ending slash metadata.Add(new MetadataItem(MetadataType.FILENAME, e.Name)); } } } } private static void GetUncompressedTarMetadata(string filename, List metadata) { GetTarMetadata(File.OpenRead(filename), metadata); } private static void GetCompressedTarMetadata(string filename, List metadata) { GetTarMetadata(new GZipInputStream(File.OpenRead(filename)), metadata); } private static void GetBZipCompressedTarMetadata(string filename, List metadata) { GetTarMetadata(new BZip2InputStream(File.OpenRead(filename)), metadata); } private static void GetTarMetadata(Stream s, List metadata) { using (TarInputStream s2 = new TarInputStream(s)) { TarEntry e; while ((e = s2.GetNextEntry()) != null) { // Note: directories can be identified by a ending slash metadata.Add(new MetadataItem(MetadataType.FILENAME, e.Name)); } } } } } VolumeDB/src/Metadata/MetadataProvider.cs0000664000175000017500000000304012067326706020510 0ustar patrickpatrick// MetadataProvider.cs // // Copyright (C) 2011 Patrick Ulbrich // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // using System; using System.Collections.Generic; namespace VolumeDB.Metadata { public abstract class MetadataProvider : IDisposable { private bool disposed; internal MetadataProvider () { disposed = false; } public abstract IEnumerable GetMetadata(string filename, string mimetype); // public void CopyTo(MetaDataProvider p) { // CopyProvider(p); // } // // protected abstract void CopyProvider(MetaDataProvider p); #region IDisposable Members public void Dispose() { Dispose(true); } #endregion protected virtual void Dispose(bool disposing) { if (!disposed) { if (disposing) { // nothing to do for now } disposed = true; } } protected void EnsureNotDisposed() { if (disposed) throw new ObjectDisposedException("MetadataProvider"); } } } VolumeDB/src/Metadata/MetadataUtils.cs0000664000175000017500000000415612067326706020027 0ustar patrickpatrick// MetadataUtils.cs // // Copyright (C) 2011, 2012 Patrick Ulbrich // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // using System; namespace VolumeDB.Metadata { public static class MetadataUtils { // returns the libextractor 0.5.x duration format. // all metadata items that have a duration must use this format public static string SecsToMetadataDuration (double seconds) { if (seconds < 60.0) return ((int)Math.Round(seconds)).ToString() + "s"; long totalSecs = (long)seconds; int mins = (int)(totalSecs / 60); int secs = (int)(totalSecs % 60); if (secs > 0) return string.Format("{0}m{1:D2}", mins, secs); else return string.Format("{0}m", mins); } public static TimeSpan MetadataDurationToTimespan(string duration) { TimeSpan t; string[] numbers = duration.Split(new string[] { "m", "s" }, StringSplitOptions.RemoveEmptyEntries); if (numbers.Length == 2) { // minutes AND seconds expected (e.g. "12m51") // (also "12m51s", although I've yet to see this occur) t = new TimeSpan(0, int.Parse(numbers[0]), int.Parse(numbers[1])); } else { // minutes OR seconds OR milliseconds expected // (e.g. "12m", "51,43s", "51,43 s", "209711") if (duration[duration.Length - 1] == 'm') t = TimeSpan.FromMinutes(double.Parse(numbers[0])); else if (duration[duration.Length - 1] == 's') t = TimeSpan.FromSeconds(double.Parse(numbers[0])); else // ms expcepted t = TimeSpan.FromMilliseconds(double.Parse(numbers[0])); } return t; } } } VolumeDB/src/Metadata/MetadataItem.cs0000664000175000017500000000177112067326706017625 0ustar patrickpatrick// MetadataItem.cs // // Copyright (C) 2011 Patrick Ulbrich // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // using System; namespace VolumeDB.Metadata { public class MetadataItem { internal MetadataItem (MetadataType type, string value) { this.Type = type; this.Value = value; } public MetadataType Type { get; private set; } public string Value { get; private set; } } } VolumeDB/src/Metadata/MetadataStore.cs0000664000175000017500000001066712067326706020027 0ustar patrickpatrick// MetadataStore.cs // // Copyright (C) 2011 Patrick Ulbrich // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // using System; using System.Text; using System.Collections.Generic; namespace VolumeDB.Metadata { public struct MetadataStore { public static readonly MetadataStore Empty = new MetadataStore((string)null); private readonly string packedString; internal MetadataStore(string metadataString) { // NOTE: nullstrings are allowed if (string.IsNullOrEmpty(metadataString)) { packedString = null; return; } if (metadataString[0] != '[') throw new ArgumentException("String contains unsupported metadata"); packedString = metadataString; } internal MetadataStore(IEnumerable metadata) { if (metadata == null) { packedString = null; return; } StringBuilder sbHeader = new StringBuilder(); StringBuilder sbData = new StringBuilder(); sbHeader.Append('['); foreach (MetadataItem i in metadata) { if (IsBadMetadata(i)) continue; if (sbHeader.Length > 1) sbHeader.Append(':'); sbHeader.Append((int)i.Type).Append(':').Append(i.Value.Length.ToString()); sbData.Append(i.Value); } sbHeader.Append(']'); if (sbData.Length == 0) packedString = null; else packedString = (sbHeader.ToString() + sbData.ToString()); } internal string MetadataString { get { return packedString; } } public MetadataItem[] ToArray() { if (packedString == null) { return new MetadataItem[0]; } int headerEndIdx = packedString.IndexOf(']'); string strHeader = packedString.Substring(1, headerEndIdx - 1); string strData = packedString.Remove(0, headerEndIdx + 1); string[] headerVals = strHeader.Split(new char[] { ':' }); MetadataItem[] metadata = new MetadataItem[headerVals.Length / 2]; int pos = 0; for (int i = 0; i < headerVals.Length; i += 2) { MetadataType type = (MetadataType)int.Parse(headerVals[i]); int valueLen = int.Parse(headerVals[i + 1]); metadata[i / 2] = new MetadataItem(type, strData.Substring(pos, valueLen)); pos += valueLen; } return metadata; } public Dictionary ToDictionary() { Dictionary dict = new Dictionary(); if (packedString == null) return dict; MetadataItem[] metadata = ToArray(); foreach (MetadataItem i in metadata) { string existing; // join items of the same type (e.g. format or filename) // (a dictionary can't contain the same key multiple times) if (dict.TryGetValue(i.Type, out existing)) dict[i.Type] = string.Format("{0}; {1}", existing, i.Value); else dict.Add(i.Type, i.Value); } return dict; } public bool IsEmpty { get { return (packedString == null); } } public static bool operator ==(MetadataStore a, MetadataStore b) { return a.MetadataString == b.MetadataString; } public static bool operator !=(MetadataStore a, MetadataStore b) { return a.MetadataString != b.MetadataString; } public override bool Equals (object o) { if (!(o is MetadataStore)) return false; return this == (MetadataStore)o; } public override int GetHashCode() { return (packedString == null) ? string.Empty.GetHashCode() : packedString.GetHashCode(); } private static bool IsBadMetadata(MetadataItem item) { // skip data that is already available in other // database fields or unreliable. if ( (item.Type == MetadataType.MIMETYPE) || (item.Type == MetadataType.THUMBNAILS) || (item.Type == MetadataType.THUMBNAIL_DATA) || (item.Type == MetadataType.CONTENT_TYPE) ) return true; // skip 0-length durations. if ((item.Type == MetadataType.DURATION) && (item.Value == "0")) return true; return false; } } } VolumeDB/src/Metadata/MetadataType.cs0000664000175000017500000000713312067326706017646 0ustar patrickpatrick// MetadataType.cs // // Copyright (C) 2011 Patrick Ulbrich // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // using System; namespace VolumeDB.Metadata { // keep in sync with libextractor 0.5.x KeywordType enum // (enum is casted directly) public enum MetadataType : int { UNKNOWN = 0, FILENAME = 1, MIMETYPE = 2, TITLE = 3, AUTHOR = 4, ARTIST = 5, DESCRIPTION = 6, COMMENT = 7, DATE = 8, PUBLISHER = 9, LANGUAGE = 10, ALBUM = 11, GENRE = 12, LOCATION = 13, VERSIONNUMBER = 14, ORGANIZATION = 15, COPYRIGHT = 16, SUBJECT = 17, KEYWORDS = 18, CONTRIBUTOR = 19, RESOURCE_TYPE = 20, FORMAT = 21, RESOURCE_IDENTIFIER = 22, SOURCE = 23, RELATION = 24, COVERAGE = 25, SOFTWARE = 26, DISCLAIMER = 27, WARNING = 28, TRANSLATED = 29, CREATION_DATE = 30, MODIFICATION_DATE = 31, CREATOR = 32, PRODUCER = 33, PAGE_COUNT = 34, PAGE_ORIENTATION = 35, PAPER_SIZE = 36, USED_FONTS = 37, PAGE_ORDER = 38, CREATED_FOR = 39, MAGNIFICATION = 40, RELEASE = 41, GROUP = 42, SIZE = 43, SUMMARY = 44, PACKAGER = 45, VENDOR = 46, LICENSE = 47, DISTRIBUTION = 48, BUILDHOST = 49, OS = 50, DEPENDENCY = 51, HASH_MD4 = 52, HASH_MD5 = 53, HASH_SHA0 = 54, HASH_SHA1 = 55, HASH_RMD160 = 56, RESOLUTION = 57, CATEGORY = 58, BOOKTITLE = 59, PRIORITY = 60, CONFLICTS = 61, REPLACES = 62, PROVIDES = 63, CONDUCTOR = 64, INTERPRET = 65, OWNER = 66, LYRICS = 67, MEDIA_TYPE = 68, CONTACT = 69, THUMBNAIL_DATA = 70, PUBLICATION_DATE = 71, CAMERA_MAKE = 72, CAMERA_MODEL = 73, EXPOSURE = 74, APERTURE = 75, EXPOSURE_BIAS = 76, FLASH = 77, FLASH_BIAS = 78, FOCAL_LENGTH = 79, FOCAL_LENGTH_35MM = 80, ISO_SPEED = 81, EXPOSURE_MODE = 82, METERING_MODE = 83, MACRO_MODE = 84, IMAGE_QUALITY = 85, WHITE_BALANCE = 86, ORIENTATION = 87, TEMPLATE = 88, SPLIT = 89, PRODUCTVERSION = 90, LAST_SAVED_BY = 91, LAST_PRINTED = 92, WORD_COUNT = 93, CHARACTER_COUNT = 94, TOTAL_EDITING_TIME = 95, THUMBNAILS = 96, SECURITY = 97, CREATED_BY_SOFTWARE = 98, MODIFIED_BY_SOFTWARE = 99, REVISION_HISTORY = 100, LOWERCASE = 101, COMPANY = 102, GENERATOR = 103, CHARACTER_SET = 104, LINE_COUNT = 105, PARAGRAPH_COUNT = 106, EDITING_CYCLES = 107, SCALE = 108, MANAGER = 109, MOVIE_DIRECTOR = 110, DURATION = 111, INFORMATION = 112, FULL_NAME = 113, CHAPTER = 114, YEAR = 115, LINK = 116, MUSIC_CD_IDENTIFIER = 117, PLAY_COUNTER = 118, POPULARITY_METER = 119, CONTENT_TYPE = 120, ENCODED_BY = 121, TIME = 122, MUSICIAN_CREDITS_LIST = 123, MOOD = 124, FORMAT_VERSION = 125, TELEVISION_SYSTEM = 126, SONG_COUNT = 127, STARTING_SONG = 128, HARDWARE_DEPENDENCY = 129, RIPPER = 130, FILE_SIZE = 131, TRACK_NUMBER = 132, ISRC = 133, DISC_NUMBER = 134, GNUNET_DISPLAY_TYPE = 135, GNUNET_ECBC_URI = 136 } } VolumeDB/src/IRecordData.cs0000664000175000017500000000173012067326706015662 0ustar patrickpatrick// IRecordData.cs // // Copyright (C) 2008 Patrick Ulbrich // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // using System; using System.Collections.Generic; namespace VolumeDB { internal interface IRecordData : IEnumerable { object this[string fieldName] { get; } object GetValue(string fieldName); void AddField(string fieldName, object value); } } VolumeDB/src/AudioTrackVolumeItem.cs0000664000175000017500000000550712067326706017604 0ustar patrickpatrick// AudioTrackVolumeItem.cs // // Copyright (C) 2010, 2011 Patrick Ulbrich // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // using System; using System.Collections.Generic; using VolumeDB.Metadata; namespace VolumeDB { public sealed class AudioTrackVolumeItem : VolumeItem { private TimeSpan duration; internal AudioTrackVolumeItem(VolumeDatabase database) : base(database, VolumeItemType.AudioTrackVolumeItem) { duration = new TimeSpan(0, 0, 0); } /// /// Required by internal factory methods like AbstractVolumeScanner.GetNewVolumeItem() /// Purpose : /// /// - guarantee that _all_ fields of this type are initialized by the caller /// (in contrast to property initialization, which easily makes you miss a property [in particular if a new one was added..]) /// /// /// - seperate fields of a type from fields of its base type (e.g. GetNewVolumeItem() initializes all fields of a the VolumeItem base type. /// Caller code only needs to initialize fields of the derived type) /// /// internal void SetAudioTrackVolumeItemFields(TimeSpan duration) { this.duration = duration; } internal override void ReadFromVolumeDBRecord(IRecordData recordData) { base.ReadFromVolumeDBRecord(recordData); long tmp = (long)recordData["Size"]; duration = TimeSpan.FromSeconds(tmp); } internal override void WriteToVolumeDBRecord(IRecordData recordData) { base.WriteToVolumeDBRecord(recordData); recordData.AddField("Size", (long)duration.TotalSeconds); } #region read-only properties public TimeSpan Duration { get { return duration; } internal set { duration = value; } } // expose artist metadata trough a dedicated property private string artist = null; public string Artist { get { if (artist == null) { Dictionary metaData = this.MetaData.ToDictionary(); // artist metadate is only available if the cd has been // scanned with metadata extraction enabled if (!metaData.TryGetValue(MetadataType.ARTIST, out artist)) artist = string.Empty; } return artist; } } #endregion } } VolumeDB/src/AssemblyInfo.cs0000664000175000017500000000343712067326706016142 0ustar patrickpatrick// AssemblyInfo.cs // // Copyright (C) 2008 - 2012 Patrick Ulbrich // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // using System.Reflection; using System.Runtime.CompilerServices; // Information about this assembly is defined by the following // attributes. // // change them to the information which is associated with the assembly // you compile. [assembly: AssemblyTitle("VolumeDB")] [assembly: AssemblyDescription("")] [assembly: AssemblyConfiguration("")] [assembly: AssemblyCompany("")] [assembly: AssemblyProduct("")] [assembly: AssemblyCopyright("2008 - 2012 Patrick Ulbrich")] [assembly: AssemblyTrademark("")] [assembly: AssemblyCulture("")] // The assembly version has following format : // // Major.Minor.Build.Revision // // You can specify all values by your own or you can build default build and revision // numbers with the '*' character (the default): [assembly: AssemblyVersion("1.0.1")] // The following attributes specify the key for the sign of your assembly. See the // .NET Framework documentation for more information about signing. // This is not required, if you don't want signing let these attributes like they're. [assembly: AssemblyDelaySign(false)] [assembly: AssemblyKeyFile("")] VolumeDB/src/TooManyResultsException.cs0000664000175000017500000000163712067326706020376 0ustar patrickpatrick// TooManyResultsException.cs // // Copyright (C) 2009 Patrick Ulbrich // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // using System; namespace VolumeDB { public class TooManyResultsException : Exception { public TooManyResultsException() : base() {} public TooManyResultsException(string msg) : base(msg) {} } } VolumeDB/src/VolumeDatabase.cs0000664000175000017500000006345112067326706016445 0ustar patrickpatrick// VolumeDatabase.cs // // Copyright (C) 2008 Patrick Ulbrich // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // using System; using System.Collections.Generic; using System.Data; using System.Text; using System.Runtime.Remoting.Messaging; using VolumeDB.Searching; using Platform.Common.Diagnostics; // MediaDirectory[] Media.GetDirectories() ? // MediaDirectory[] dir.GetDirectories() ? namespace VolumeDB { /* About threadsafety: it's only save to read/write concurrently to a database file from _one single_ VolumeDatabase instance (i.e. multiple threads may access the same VolumeDatabase object simultanously). it's not save to read/write to a database file from multiple VolumeDatabase instances / multiple processes. To achive this functionality database-level locking must be implemented (not supported by current Sqlite ADO providers). The VolumeDatabase class was designed with compatibility to most sql databases backends in mind. To achive compatibility with most sql db backends, database access logic must be implemented with the least common dominator in mind, esp. when it comes to multihreading. The least common dominator is libSQLite - which is single threaded. Note to maintainers: _every_ access to the conn object/a DataReader must be surrounded by the EnterConnectionLock()/ExitConnectionLock() methods. Though, using the conn object/DataReaders explicitly shouldn't be necessary - the Execute*() helper methods should fullfil most needs and handle locking already. */ /// ///Class representing the database that holds contents/infotmation of scanned volumes. /// public sealed partial class VolumeDatabase : IDisposable { private const int DB_VERSION = 1; private const string SQL_DATETIME_FORMAT = "yyyy-MM-dd HH:mm:ss"; // prevent long wating time / massive mem consumption by limiting the searchstr length public const int MIN_SEARCHSTR_LENGTH = 3; internal const long ID_NONE = 0; // represents a "not-set" value for foreign keys to ID fields (e.g. Volumes.VolumeID, Items.ItemID) internal const long ID_FIRST = 1; // first ID of a table record private bool disposed; private SqlBackend sql; // prevents nasty item searches with too many results // from cosuming all mem (and time...). -1 = disabled. private int searchItemResultsLimit; public VolumeDatabase(string dbPath) : this(dbPath, false) {} public VolumeDatabase(string dbPath, bool create) { if (dbPath == null) throw new ArgumentNullException("dbPath"); disposed = false; sql = new SqlBackend(dbPath, create, this); searchItemResultsLimit = -1; if (create) { CreateTables(); } else { int version = GetDBProperties().Version; if (version != DB_VERSION) { sql.Close(); throw new UnsupportedDbVersionException(string.Format("Found version {0}, expected version is {1}", version, DB_VERSION)); } } } #region Events public event EventHandler BeginWriteAccess; public event EventHandler EndWriteAccess; private void OnBeginWriteAccess(EventArgs e) { if (this.BeginWriteAccess != null) this.BeginWriteAccess(this, e); } private void OnEndWriteAccess(EventArgs e) { if (this.EndWriteAccess != null) this.EndWriteAccess(this, e); } #endregion public void Close() { Dispose(true); } public bool IsClosed { get { return disposed; } } public DatabaseProperties GetDBProperties() { EnsureOpen(); DatabaseProperties p = new DatabaseProperties(this); IVolumeDBRecord record = p; string query = string.Format("SELECT * FROM {0}", record.TableName); sql.ExecuteReader(query, delegate(IDataReader reader, IRecordData readerRecData) { reader.Read(); record.SetRecordData(readerRecData); record.IsNew = false; }); return p; } public void UpdateDBProperties(DatabaseProperties p) { EnsureOpen(); if (p == null) throw new ArgumentNullException("p"); WriteRecord(p, true); } public Volume GetVolume(long volumeID) { EnsureOpen(); // TODO : VolumeDatabase shouldnt hardcode table fields or table names Volume[] volumes = QueryVolumes(string.Format("SELECT * FROM Volumes WHERE VolumeID = {0}", volumeID)); return volumes.Length == 0 ? null : volumes[0]; } public IAsyncResult BeginSearchVolume(AsyncCallback callback, object state) { //if (callback == null) // throw new ArgumentNullException("callback"); EnsureOpen(); BeginSearchDelegate d = new BeginSearchDelegate(_SearchVolume); return d.BeginInvoke(null, callback, state); } public IAsyncResult BeginSearchVolume(ISearchCriteria searchCriteria, AsyncCallback callback, object state) { if (searchCriteria == null) throw new ArgumentNullException("searchCriteria"); //if (callback == null) // throw new ArgumentNullException("callback"); EnsureOpen(); BeginSearchDelegate d = new BeginSearchDelegate(_SearchVolume); return d.BeginInvoke(searchCriteria, callback, state); } public Volume[] EndSearchVolume(IAsyncResult asyncResult) { //EnsureOpen(); // DON'T! if (asyncResult == null) throw new ArgumentNullException("asyncResult"); BeginSearchDelegate d = (BeginSearchDelegate) ((AsyncResult)asyncResult).AsyncDelegate; return d.EndInvoke(asyncResult); } public Volume[] SearchVolume() { EnsureOpen(); return _SearchVolume(null); } public Volume[] SearchVolume(ISearchCriteria searchCriteria) { if (searchCriteria == null) throw new ArgumentNullException("searchCriteria"); EnsureOpen(); return _SearchVolume(searchCriteria); } private Volume[] _SearchVolume(ISearchCriteria searchCriteria) { // TODO : check SQL output! implemetation was rewritten from scratch!! // TODO : VolumeDatabase shouln't hardcode fieldnames or tablenames // TODO : Volume.TableName, Volume.IDField? //const string ORDER_FIELD = "Volumes.VolumeID"; // slows down searching /*** build sql query ***/ string sqlQuery; //sqlQuery = string.Format("SELECT * FROM Volumes WHERE {0} ORDER BY {1};", condition, ORDER_FIELD); if (searchCriteria == null) { // when searching volumes, the searchcriteria may be optional // since the resultset can not become as big as in in item searches. // apart from that there must be a way to retrieve all volumes in the database. sqlQuery = "SELECT * FROM Volumes;"; } else { string condition = searchCriteria.GetSqlSearchCondition(); if (condition.Length == 0) // e.g. empty SearchCriteriaGroup throw new ArgumentException("SearchCriteria is empty", "searchCriteria"); if ((searchCriteria.SearchCriteriaType & SearchCriteriaType.ItemSearchCriteria) == SearchCriteriaType.ItemSearchCriteria) { // searchriteria contains item searchriteria -> join items table sqlQuery = string.Format("SELECT DISTINCT Volumes.* FROM Volumes, Items WHERE ({0}) AND (Volumes.VolumeID = Items.VolumeID);", condition); } else { sqlQuery = string.Format("SELECT * FROM Volumes WHERE {0};", condition); } } if (Global.EnableDebugging) { Debug.WriteLine(string.Format("_SearchVolume() executes query: '{0}'", sqlQuery)); } return QueryVolumes(sqlQuery); } /// /// Removes a volume and all associated items. /// /// Volume object to be removed from the database. public void RemoveVolume(Volume volume) { RemoveVolume(volume.VolumeID); } /// /// Removes a volume and all associated items. /// /// ID of the volume to be removed from the database. public void RemoveVolume(long volumeID) { // TODO : what if a volume has been deleted from the database physicaly, but Insert/UpdataeChanges() is called on the object representing the volume? // TODO : the same applies to VolumeItems.. // TODO : it's a general problem affecting volume/volumeitem operations on the database (e.g. VolumeItem.GetOwnerVolume()) // TODO : review whether that's ok / how to improve that EnsureOpen(); // TODO : VolumeDatabase shouldnt hardcode table fields string[] deleteCommands = { "DELETE FROM Items WHERE VolumeID = " + volumeID, "DELETE FROM Volumes WHERE VolumeID = " + volumeID }; sql.ExecuteNonQuery(deleteCommands); } public void UpdateVolume(Volume volume) { EnsureOpen(); WriteRecord(volume, true); } internal void InsertVolume(Volume volume) { EnsureOpen(); WriteRecord(volume, false); } public void UpdateVolumeItem(VolumeItem item) { UpdateVolumeItems( new VolumeItem[] { item } ); } public void UpdateVolumeItems(VolumeItem[] items) { EnsureOpen(); WriteRecords((IVolumeDBRecord[])items, true); } internal void InsertVolumeItem(VolumeItem item) { InsertVolumeItems(new VolumeItem[] { item }); } internal void InsertVolumeItems(VolumeItem[] items) { EnsureOpen(); WriteRecords((IVolumeDBRecord[])items, false); } public VolumeItem GetVolumeItem(long volumeID, long itemID) { EnsureOpen(); // TODO : VolumeDatabase shouldnt hardcode table fields or table names VolumeItem[] items = QueryItems( string.Format("SELECT * FROM Items WHERE VolumeID = {0} AND ItemID = {1}", volumeID, itemID), -1); return items.Length == 0 ? null : items[0]; } public int SearchItemResultsLimit { get { return searchItemResultsLimit; } set { searchItemResultsLimit = value; } } public IAsyncResult BeginSearchItem(ISearchCriteria searchCriteria, AsyncCallback callback, object state) { if (searchCriteria == null) throw new ArgumentNullException("searchCriteria"); //if (callback == null) // throw new ArgumentNullException("callback"); EnsureOpen(); BeginSearchDelegate d = new BeginSearchDelegate(_SearchItem); return d.BeginInvoke(searchCriteria, callback, state); } public VolumeItem[] EndSearchItem(IAsyncResult asyncResult) { //EnsureOpen(); // DON'T! if (asyncResult == null) throw new ArgumentNullException("asyncResult"); BeginSearchDelegate d = (BeginSearchDelegate) ((AsyncResult)asyncResult).AsyncDelegate; return d.EndInvoke(asyncResult); } public VolumeItem[] SearchItem(ISearchCriteria searchCriteria) { if (searchCriteria == null) throw new ArgumentNullException("searchCriteria"); EnsureOpen(); return _SearchItem(searchCriteria); } private VolumeItem[] _SearchItem(ISearchCriteria searchCriteria) { // TODO : check SQL output! implemetation was rewritten from scratch!! // TODO : VolumeDatabase shouln't hardcode fieldnames or tablenames //const string ORDER_FIELD = "Items.VolumeID"; // slows down searching drastically /*** build sql query ***/ string condition = searchCriteria.GetSqlSearchCondition(); if (condition.Length == 0) // e.g. empty SearchCriteriaGroup throw new ArgumentException("SearchCriteria is empty", "searchCriteria"); string sqlQuery; if ((searchCriteria.SearchCriteriaType & SearchCriteriaType.VolumeSearchCriteria) == SearchCriteriaType.VolumeSearchCriteria) { // searchriteria contains volume searchriteria -> join volumes table sqlQuery = string.Format("SELECT Items.* FROM Items, Volumes WHERE ({0}) AND (Items.VolumeID = Volumes.VolumeID);", condition); } else { //sqlQuery = string.Format("SELECT * FROM Items WHERE {0} ORDER BY {1};", condition, ORDER_FIELD); sqlQuery = string.Format("SELECT * FROM Items WHERE {0};", condition); } if (Global.EnableDebugging) { Debug.WriteLine(string.Format("_SearchItem() executes query: '{0}'", sqlQuery)); } return QueryItems(sqlQuery, searchItemResultsLimit); } // used by Volume.GetRoot() and specific implementations of Volume.GetRoot() internal TRootItem GetVolumeRoot(long volumeID) where TRootItem : IContainerItem { EnsureOpen(); // TODO : VolumeDatabase shouldnt hardcode table fields or table names TRootItem[] items = QueryItems( string.Format("SELECT * FROM Items WHERE (VolumeID = {0}) AND (ParentID = {1})", volumeID, ID_NONE), -1); return items.Length == 0 ? default(TRootItem) : items[0]; } // used by IContainerItem.GetContainers() and specific implementations of IContainerItem.GetContainers() internal TContainerItem[] GetChildContainerItems(long volumeID, long itemID) where TContainerItem : IContainerItem { EnsureOpen(); // TODO : VolumeDatabase shouldnt hardcode table fields or table names return QueryItems( string.Format("SELECT * FROM Items WHERE (VolumeID = {0}) AND (ParentID = {1}) AND (IsContainer = 1)", volumeID, itemID), -1); } // used by IContainerItem.GetItems() and specific implementations of IContainerItem.GetItems() internal TChildItem[] GetChildItems(long volumeID, long itemID) where TChildItem : IChildItem { EnsureOpen(); // TODO : VolumeDatabase shouldnt hardcode table fields or table names return QueryItems( string.Format("SELECT * FROM Items WHERE (VolumeID = {0}) AND (ParentID = {1}) AND (IsContainer = 0)", volumeID, itemID), -1); } internal long GetNextVolumeID() { EnsureOpen(); sql.EnterConnectionLock(); try { // volumeID must be unique per database, so a id counter table is used sql.ExecuteNonQuery("UPDATE IdCounters SET Count = Count + 1 WHERE IdFieldname = 'Volumes.VolumeID'"); long nextID = (long)sql.ExecuteScalar("SELECT Count FROM IdCounters WHERE IdFieldname = 'Volumes.VolumeID'"); return nextID; } finally { sql.ExitConnectionLock(); } } private void CreateTables() { List commands = new List(); // // create tables // * remarks regarding fields: // some fields (e.g. Files, Dirs, Size, Location, LastWriteTime, SymLinkTargetID, ...) can be NULL // because they're not used by Non-Filesystem-Volumes (e.g. Audio CDs). // most of the others fields with the NULL keyword attached are optional. // * remarks regarding primary keys: // PRIMARY KEY (VolumeID, ItemID) speeds up VolumeItem::GetParent(), // VolumeDatabase::GetVolumeItem(), removing items by volumeID (and probably resolving symlink targets) string sqlCreate = string.Format( @" CREATE TABLE DatabaseProperties ( Name VARCHAR({0}), Description TEXT, Created DATE NOT NULL, Version INTEGER NOT NULL, GUID VARCHAR(36) NOT NULL ); CREATE TABLE Volumes ( VolumeID INTEGER PRIMARY KEY, Title VARCHAR({1}), Added DATE, VolumeType INTEGER NOT NULL, IsHashed BOOLEAN NOT NULL DEFAULT 0, ArchiveNr VARCHAR({2}), DriveType INTEGER NOT NULL, Loaned_To VARCHAR({3}), Loaned_Date DATE, Return_Date DATE, Category VARCHAR({4}), Description TEXT, Keywords TEXT, Files INTEGER, Dirs INTEGER, Size INTEGER ); CREATE TABLE Items ( VolumeID INTEGER, ItemID INTEGER, ParentID INTEGER NOT NULL, ItemType INTEGER NOT NULL, Name VARCHAR({5}) NOT NULL, MimeType VARCHAR({6}), MetaData TEXT, Note TEXT, Keywords TEXT, Hash VARCHAR({7}), IsContainer BOOLEAN NOT NULL DEFAULT 0, Location VARCHAR({8}), LastWriteTime DATE, SymLinkTargetID INTEGER, Size INTEGER, PRIMARY KEY (VolumeID, ItemID) ); CREATE TABLE IdCounters ( IdFieldname VARCHAR(64) PRIMARY KEY, Count INTEGER NOT NULL ) ", DatabaseProperties.MAX_NAME_LENGTH, Volume.MAX_TITLE_LENGTH, Volume.MAX_ARCHIVE_NO_LENGTH, Volume.MAX_LOANED_TO_LENGTH, Volume.MAX_CATEGORY_LENGTH, VolumeItem.MAX_NAME_LENGTH, VolumeItem.MAX_MIMETYPE_LENGTH, VolumeItem.MAX_HASH_LENGTH, FileVolumeItem.MAX_LOCATION_LENGTH ); commands.Add(sqlCreate); // // additional indices are added here: // // index that (together with the VolumeID index part of the primary key) // speeds up all GetChild*() functions (majority of all queries used in Basenji) // and Volume::GetRoot() commands.Add("CREATE INDEX IDX_Items_ParentID ON Items (ParentID)"); // improves searching performance (EDIT: no, it does not!?) //commands.Add("CREATE INDEX IDX_Items_Name ON Items (Name)"); // TODO : create furhter indices for fields frequently involved in full text searches here // // initialize tables // commands.Add(string.Format( @" INSERT INTO DatabaseProperties (Name, Description, Created, Version, GUID) Values('', '', '{0}', {1}, '{2}'); " , DateTime.Now.ToString(SQL_DATETIME_FORMAT), DB_VERSION, Guid.NewGuid().ToString()) ); commands.Add(string.Format("INSERT INTO IdCounters (IdFieldName, Count) VALUES('Volumes.VolumeID', {0})", (ID_FIRST - 1))); //commands.Add("INSERT INTO IdCounters (IdFieldName, Count) VALUES('Items.ItemID', 0)"); sql.ExecuteNonQuery(commands.ToArray()); } private void EnsureOpen() { if (disposed) throw new ObjectDisposedException("VolumeDatabase", "This VolumeDatabase has been closed"); } private void WriteRecord(IVolumeDBRecord record, bool update) { WriteRecords(new IVolumeDBRecord[] { record }, update); } private void WriteRecords(IVolumeDBRecord[] records, bool update) { List sqlCommands = new List(); StringBuilder sqlcmd = new StringBuilder(); int changed = 0; try { if (update) { foreach (IVolumeDBRecord record in records) { if (record.IsNew) throw new InvalidOperationException("Database record can not be updated because it has not been inserted yet"); // reset stringbuilder sqlcmd.Length = 0; sqlcmd.Append("UPDATE ").Append(record.TableName).Append(" SET "); int n = 0; IRecordData recData = record.GetRecordData(); foreach (FieldnameValuePair pair in recData) { if (n > 0) sqlcmd.Append(", "); string val = SqlPrepareValue(pair.Value, true); sqlcmd.Append(pair.Fieldname).Append(" = ").Append(val); n++; } string[] primarykeyFields = record.PrimaryKeyFields; if ((primarykeyFields != null) && (primarykeyFields.Length > 0)) { // single-record-tables (e.g. table DatabaseProperties) may not have a primary key sqlcmd.Append(" WHERE "); for (int i = 0; i < primarykeyFields.Length; i++) { if (i > 0) sqlcmd.Append(" AND "); string pk = primarykeyFields[i]; sqlcmd.Append(pk).Append(" = ").Append(recData[pk]); } } // string idField = record.TableIDField; // if (!string.IsNullOrEmpty(idField)) // single-record-tables (e.g. table DatabaseProperties) may not have a primary key // sqlcmd.Append(" WHERE ").Append(idField).Append(" = ").Append(recData[idField]); sqlCommands.Add(sqlcmd.ToString()); } } else { // insert StringBuilder fields = new StringBuilder(); StringBuilder values = new StringBuilder(); foreach (IVolumeDBRecord record in records) { if (!record.IsNew) throw new InvalidOperationException("Database record has already been inserted"); // reset stringbuilders sqlcmd.Length = 0; fields.Length = 0; values.Length = 0; sqlcmd.Append("INSERT INTO ").Append(record.TableName).Append(' '); int n = 0; IRecordData recData = record.GetRecordData(); foreach (FieldnameValuePair pair in recData) { if (n > 0) { fields.Append(", "); values.Append(", "); } string val = SqlPrepareValue(pair.Value, true); fields.Append(pair.Fieldname); values.Append(val); n++; } sqlcmd.Append('(').Append(fields.ToString()).Append(") VALUES (").Append(values.ToString()).Append(')'); record.IsNew = false; // mark the record object as not-new changed++; sqlCommands.Add(sqlcmd.ToString()); } } if (sqlCommands.Count > 1) sql.ExecuteNonQuery(sqlCommands.ToArray()); else sql.ExecuteNonQuery(sqlCommands[0]); } catch(Exception) { // undo changes if (!update) { for (int i = 0; i < changed; records[i++].IsNew = true); } throw; } } private static string SqlPrepareValue(object value, bool replaceEmptyByNull) { return SqlPrepareValue(value, replaceEmptyByNull, null); } private static string SqlPrepareValue(object value, bool replaceEmptyByNull, string formatStringValue) { // TODO : or simply put _all_ values in apostrophes, so i dont have to care about the type? // would that be valid standard-sql? // Do querys still work (e.g. "WHERE fieldname = 1" must be the same as "WHERE fieldname = '1'") ? string retVal = null; if (formatStringValue == null || formatStringValue.Length == 0) formatStringValue = "'{0}'"; if (value == null) { retVal = "NULL"; } else if (value is string || value is char) { string s = value.ToString(); // cast to string would be bad here -- type of value could be char retVal = (replaceEmptyByNull && s.Length == 0) ? "NULL" : string.Format(formatStringValue, s.Replace("'","''")); } else if (value is DateTime) { // DateTime.MinValue is interpreted as "empty" DateTime d = (DateTime)value; if (replaceEmptyByNull && d.Ticks == 0L) retVal = "NULL"; else retVal = string.Format(formatStringValue, ((DateTime)value).ToString(SQL_DATETIME_FORMAT)); } else if (value is Enum) { // TODO : is there a better way to convert enum types to string? retVal = ((Enum)value).ToString("D"); } else if (value is bool) { retVal = ((bool)value) ? "1" : "0"; } else { // numeric types like int, long, double, byte etc // and unknown types (unknown types that return an alphanumeric value won't work though) retVal = value.ToString(); } return retVal; } private Volume[] QueryVolumes(string sqlQuery) { List list = new List(); sql.ExecuteReader(sqlQuery, delegate(IDataReader reader, IRecordData readerRecData) { while(reader.Read()) { // TODO : if possible, don't hardcode 'reader["VolumeType"]' here, // use something like reader[AnInterface.TypeField]. VolumeDatabase shouldnt include table-/fieldnames if possible. // the classes representing the data should hold the names. Volume volume = Volume.CreateInstance((VolumeType)(int)(long)reader["VolumeType"], this); IVolumeDBRecord record = volume; record.SetRecordData(readerRecData); record.IsNew = false; list.Add(volume); } }); return list.ToArray(); } private TItem[] QueryItems(string sqlQuery, int limit) where TItem : IChildItem // IChildItem is the least common denominator of all volumeitems and related interfaces (e.g. DirectoryVolumeItem, FileVolumeItem, ..., IContainerItem, IChildItem) { List list = new List(); int n = 0; sql.ExecuteReader(sqlQuery, delegate(IDataReader reader, IRecordData readerRecData) { while(reader.Read()) { if ((limit > -1) && (++n > limit)) { list.Clear(); throw new TooManyResultsException( string.Format("The result limit of {0} items has been reached", limit)); } // TODO : if possible, don't hardcode 'reader["ItemType"]' here, // use something like reader[AnInterface.TypeField]. VolumeDatabase shouldnt include table-/fieldnames if possible. // the classes representing the data should hold the names. // TODO : why do i have to cast to (IChildItem) first? TItem item = (TItem)(IChildItem)VolumeItem.CreateInstance((VolumeItemType)(int)(long)reader["ItemType"], this); IVolumeDBRecord record = (IVolumeDBRecord)item; record.SetRecordData(readerRecData); record.IsNew = false; list.Add(item); } }); return list.ToArray(); } /// ///Begins a transaction on the current thread. ///Other threads are blocked from accessing the database until this thread calls TransactionCommit() or TransactionRollback(). ///Callers of this method must make sure that TransactionRollback() is called whenever an exception occurs in succeeding mehtod calls on the same VolumeDatabase instance. ///Ignoring exceptions of VolumeDatabase methods during an active transaction can lead to loss of data. /// public void TransactionBegin() { EnsureOpen(); sql.TransactionBegin(); } /// ///Commits the transaction of the current thread. /// public void TransactionCommit() { EnsureOpen(); sql.TransactionCommit(); } /// ///Rolls back the transaction of the current thread. /// public void TransactionRollback() { EnsureOpen(); sql.TransactionRollback(); } #region IDisposable Members void IDisposable.Dispose() { Dispose(true); } #endregion private void Dispose(bool disposing) { if (!disposed) { if (disposing) { if (!sql.IsClosed) sql.Close(); } sql = null; } disposed = true; } private delegate T[] BeginSearchDelegate(ISearchCriteria searchCriteria); } }VolumeDB/src/DatabaseProperties.cs0000664000175000017500000000650212067326706017324 0ustar patrickpatrick// DatabaseProperties.cs // // Copyright (C) 2008 Patrick Ulbrich // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // // TODO : // if other VolumeDBDataType types (Volume, VolumeItem...) overwrite Dispose(), // DatabaseProperties must overwrite as well! using System; namespace VolumeDB { public sealed class DatabaseProperties : VolumeDBDataType { public const int MAX_NAME_LENGTH = 64; public const int MAX_DESCRIPTION_LENGTH = 4096; // table info required by VolumeDBDataType private const string tableName = "DatabaseProperties"; private static readonly string[] primarykeyFields = null; private string name; private string description; private DateTime created; private int version; private string guid; private VolumeDatabase database; internal DatabaseProperties(VolumeDatabase database) : base(tableName, primarykeyFields) { this.name = null; this.description = null; this.created = DateTime.MinValue; this.version = 0; this.guid = null; this.database = database; } #region read-only properties public DateTime Created { get { return created; } internal set { created = value; } } public int Version { get { return version; } internal set { version = value; } } public string Guid { get { return guid; } internal set { guid = value; } } #endregion #region editable properties public string Name { get { return name ?? string.Empty; } set { EnsurePropertyLength(value, MAX_NAME_LENGTH); name = value; } } public string Description { get { return description ?? string.Empty; } set { EnsurePropertyLength(value, MAX_DESCRIPTION_LENGTH); description = value; } } #endregion internal override void ReadFromVolumeDBRecord(IRecordData recordData) { name = Util.ReplaceDBNull( recordData["Name"], null); description = Util.ReplaceDBNull( recordData["Description"], null); created = Util.ReplaceDBNull( recordData["Created"], DateTime.MinValue); version = (int)(long) recordData["Version"]; guid = (string) recordData["GUID"]; } internal override void WriteToVolumeDBRecord(IRecordData recordData) { recordData.AddField("Name", name); recordData.AddField("Description", description); recordData.AddField("Created", created); recordData.AddField("Version", version); recordData.AddField("GUID", guid); } internal override void InsertIntoDB() { throw new NotSupportedException("This object supports updating only"); } public override void UpdateChanges() { if (database == null) throw new InvalidOperationException("No database associated"); database.UpdateDBProperties(this); } } } VolumeDB/src/DbData.cs0000664000175000017500000000367012067326706014665 0ustar patrickpatrick// DbData.cs // // Copyright (C) 2010 Patrick Ulbrich // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // using System; using System.IO; namespace VolumeDB { public static class DbData { public static string GetVolumeDataPath(string dbDataPath, long volumeID) { return Path.Combine(dbDataPath, volumeID.ToString()); } public static string CreateVolumeDataPath(string dbDataPath, long volumeID) { string path = GetVolumeDataPath(dbDataPath, volumeID); // make sure there is no directory with the same name as the volume directory // that is about to be created // (the volume directory may be deleted in a catch block on scanning/import failure, // so make sure that no existing dir will be deleted) if (Directory.Exists(path)) throw new ArgumentException("dbDataPath already contains a directory for this volume"); Directory.CreateDirectory(path); return path; } public static string GetVolumeDataThumbsPath(string volumeDataPath) { return Path.Combine(volumeDataPath, "thumbs"); } public static string CreateVolumeDataThumbsPath(string volumeDataPath) { string path = GetVolumeDataThumbsPath(volumeDataPath); if (Directory.Exists(path)) throw new ArgumentException("volumeDataPath already contains a thumbs directory"); Directory.CreateDirectory(path); return path; } } } VolumeDB/src/AudioCdRootVolumeItem.cs0000664000175000017500000000306612067326706017730 0ustar patrickpatrick// AudioCdRootVolumeItem.cs // // Copyright (C) 2010 Patrick Ulbrich // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // using System; namespace VolumeDB { public sealed class AudioCdRootVolumeItem : VolumeItem, IContainerItem { internal AudioCdRootVolumeItem(VolumeDatabase database) : base(database, VolumeItemType.AudioCdRootVolumeItem) { } #region IContainerItem Members IChildItem[] IContainerItem.GetItems() { return Database.GetChildItems(VolumeID, ItemID); } IContainerItem[] IContainerItem.GetContainers() { return new IContainerItem[0]; } #endregion // AudioCdRootVolumeItem specific implementation of IContainerItem.GetItems() public AudioTrackVolumeItem[] GetTracks() { return Database.GetChildItems(VolumeID, ItemID); } internal override void WriteToVolumeDBRecord(IRecordData recordData) { base.WriteToVolumeDBRecord(recordData); recordData.AddField("IsContainer", true); } } } VolumeDB/src/Import/0000775000175000017500000000000012067326706014463 5ustar patrickpatrickVolumeDB/src/Import/Events.cs0000664000175000017500000000320712067326706016260 0ustar patrickpatrick// Events.cs // // Copyright (C) 2010 Patrick Ulbrich // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // using System; using System.ComponentModel; namespace VolumeDB.Import { public delegate void ErrorEventHandler(object sender, ErrorEventArgs e); public delegate void ImportCompletedEventHandler(object sender, ImportCompletedEventArgs e); public delegate void ProgressUpdateEventHandler(object sender, ProgressUpdateEventArgs e); public class ErrorEventArgs : EventArgs { private Exception ex; public ErrorEventArgs(Exception ex) : base() { this.ex = ex; } public Exception Exception { get { return ex; } } } public class ImportCompletedEventArgs : AsyncCompletedEventArgs { public ImportCompletedEventArgs(Exception error, bool cancelled) : base(error, cancelled, null) {} } public class ProgressUpdateEventArgs : EventArgs { private double completed; public ProgressUpdateEventArgs(double completed) : base() { this.completed = completed; } public double Completed { get { return completed; } } } } VolumeDB/src/Import/GnomeCatalogImport.cs0000664000175000017500000003045312067326706020552 0ustar patrickpatrick// GnomeCatalogImport.cs // // Copyright (C) 2010 - 2012 Patrick Ulbrich // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // using System; using System.Collections.Generic; using System.Data; using System.Globalization; using Platform.Common.DB; using Platform.Common.Diagnostics; using VolumeDB.Metadata; namespace VolumeDB.Import { [Import("GnomeCatalog", "gcatalog")] public sealed class GnomeCatalogImport : AbstractImport { private const int TOTAL_FILES = 0; private const int TOTAL_DIRS = 1; private const int TOTAL_SIZE = 2; public GnomeCatalogImport(string sourceDbPath, VolumeDatabase targetDb, string dbDataPath, int bufferSize) : base(sourceDbPath, targetDb, dbDataPath, bufferSize) {} internal override void ImportThreadMain(string sourceDbPath, VolumeDatabase targetDb, string dbDataPath, BufferedVolumeItemWriter writer) { string thumbsPath = sourceDbPath + "_thumbs"; string sqlDisks = "SELECT * FROM disks ORDER BY id"; string sqlFiles = "SELECT * FROM files WHERE iddisk = {0} ORDER BY iddisk, id"; using (IDbConnection conn = SqliteDB.Open(sourceDbPath, false)) { long totalFiles = CountFiles(conn); long fileCounter = 0; using (IDbCommand cmdDisks = conn.CreateCommand()) { using (IDbCommand cmdFiles = conn.CreateCommand()) { cmdDisks.CommandText = sqlDisks; using (IDataReader readerDisks = cmdDisks.ExecuteReader()) { while (readerDisks.Read()) { long diskID = (long)readerDisks["id"]; long minFileID = GetMinFileID(conn, diskID); string rootPath = "file://" + (string)readerDisks["root"]; long volumeID = targetDb.GetNextVolumeID(); long[] counters = { 0L, 0L, 0L }; string volDBThumbsPath = CreateThumbsDir(dbDataPath, volumeID); cmdFiles.CommandText = string.Format(sqlFiles, diskID); using (IDataReader readerFiles = cmdFiles.ExecuteReader()) { while (readerFiles.Read()) { long fileID = (long)readerFiles["id"]; ImportFile(readerFiles, volumeID, minFileID, rootPath, ConvertMetaData(conn, fileID), targetDb, writer, counters); ImportThumb(fileID, (2 + fileID - minFileID), thumbsPath, volDBThumbsPath); PostProgressUpdate((++fileCounter * 100.0) / totalFiles); CheckForCancellationRequest(); } } ImportDisk(readerDisks, volumeID, targetDb, counters); } } } } } } private static long CountFiles(IDbConnection conn) { string sql = "SELECT COUNT(id) FROM files"; long count; using (IDbCommand cmd = conn.CreateCommand()) { cmd.CommandText = sql; count = (long)cmd.ExecuteScalar(); } return count; } private static long GetMinFileID(IDbConnection conn, long diskID) { string sql = string.Format("SELECT MIN(id) FROM files WHERE iddisk = {0}", diskID); long minID; using (IDbCommand cmd = conn.CreateCommand()) { cmd.CommandText = sql; object val = cmd.ExecuteScalar(); if (val == DBNull.Value) minID = 1; else minID = (long)cmd.ExecuteScalar(); } return minID; } private static void ImportDisk(IDataReader reader, long volumeID, VolumeDatabase db, long[] counters) { FileSystemVolume v = new FileSystemVolume(db); // try to guess the drivetype VolumeDriveType driveType; string root = (string)reader["root"]; if (root.ToUpper().Contains("CDROM") || root.ToUpper().Contains("DVD")) driveType = VolumeDriveType.CDRom; else if (root.StartsWith("/media")) driveType = VolumeDriveType.Removable; else driveType = VolumeDriveType.Harddisk; v.SetVolumeFields(volumeID, Util.ReplaceDBNull(reader["name"], null), DateTime.Now, false, null, driveType, Util.ReplaceDBNull(reader["borrow"], null), DateTime.MinValue, DateTime.MinValue, null, Util.ReplaceDBNull(reader["comment"], null), null); v.SetFileSystemVolumeFields(counters[TOTAL_FILES], counters[TOTAL_DIRS], counters[TOTAL_SIZE]); v.InsertIntoDB(); // insert root item DirectoryVolumeItem item = new DirectoryVolumeItem(db); item.SetFileSystemVolumeItemFields(null, DateTime.MinValue, VolumeDatabase.ID_NONE); item.SetVolumeItemFields(volumeID, 1L, 0L, "/", VolumeScanner.FilesystemVolumeScanner.MIME_TYPE_DIRECTORY, MetadataStore.Empty, null, null); item.InsertIntoDB(); } private static void ImportFile(IDataReader reader, long volumeID, long minFileID, string rootPath, MetadataStore metaData, VolumeDatabase db, BufferedVolumeItemWriter writer, long[] counters) { FileSystemVolumeItem item; if ((string)reader["type"] == "directory") { item = new DirectoryVolumeItem(db); counters[TOTAL_DIRS]++; } else { item = new FileVolumeItem(db); long size = (long)reader["size"]; ((FileVolumeItem)item).SetFileVolumeItemFields(size, null); counters[TOTAL_FILES]++; counters[TOTAL_SIZE] += size; } string path = (string)reader["path"]; Debug.Assert(path.StartsWith("file://"), "path starts with 'file://'"); string name = (string)reader["name"]; string location = DecoderUtility.UrlDecode(path); location = location.Substring(rootPath.Length); location = location.Substring(0, location.Length - name.Length - 1); if (location.Length == 0) location = "/"; long itemID = 2 + (long)reader["id"] - minFileID; // id 1 is the root item long parentID = Math.Max(1, 2 + (long)reader["idparent"] - minFileID); item.SetFileSystemVolumeItemFields(location, DateTime.MinValue, VolumeDatabase.ID_NONE); item.SetVolumeItemFields(volumeID, itemID, parentID, name, Util.ReplaceDBNull(reader["mime"], null), metaData, Util.ReplaceDBNull(reader["comment"], null), null); writer.Write(item); } private static MetadataStore ConvertMetaData(IDbConnection conn, long fileID) { string sql = string.Format("SELECT * FROM metadata WHERE id = {0}", fileID); Dictionary originalData = new Dictionary(); List convertedData = new List(); string tmp; using (IDbCommand cmd = conn.CreateCommand()) { cmd.CommandText = sql; using (IDataReader reader = cmd.ExecuteReader()) { while (reader.Read()) { originalData.Add((string)reader["key"], (string)reader["value"]); } } } if (originalData.Count == 0) return MetadataStore.Empty; // import width / height string width = null; string height = null; if (!(originalData.TryGetValue("width", out width) && originalData.TryGetValue("height", out height))) { originalData.TryGetValue("video_width", out width); originalData.TryGetValue("video_height", out height); } if (!string.IsNullOrEmpty(width) && !string.IsNullOrEmpty(height)) { convertedData.Add(new MetadataItem(MetadataType.SIZE, string.Format("{0}x{1}", width, height))); } // import software if (originalData.TryGetValue("software", out tmp)) { convertedData.Add(new MetadataItem(MetadataType.SOFTWARE, tmp)); } // import duration if (originalData.TryGetValue("video_length", out tmp) || originalData.TryGetValue("length", out tmp)) { double val; if (double.TryParse(tmp, NumberStyles.AllowDecimalPoint, CultureInfo.InvariantCulture.NumberFormat, out val)) { convertedData.Add(new MetadataItem(MetadataType.DURATION, MetadataUtils.SecsToMetadataDuration(val))); } } // import comment if (originalData.TryGetValue("comment", out tmp)) { convertedData.Add(new MetadataItem(MetadataType.COMMENT, tmp)); } // import album if (originalData.TryGetValue("album", out tmp)) { convertedData.Add(new MetadataItem(MetadataType.ALBUM, tmp)); } // import artist if (originalData.TryGetValue("artist", out tmp)) { convertedData.Add(new MetadataItem(MetadataType.ARTIST, tmp)); } // import title if (originalData.TryGetValue("title", out tmp)) { convertedData.Add(new MetadataItem(MetadataType.TITLE, tmp)); } // import genre if (originalData.TryGetValue("genre", out tmp)) { convertedData.Add(new MetadataItem(MetadataType.GENRE, tmp)); } // import year if (originalData.TryGetValue("userdate", out tmp)) { convertedData.Add(new MetadataItem(MetadataType.YEAR, tmp)); } // import publisher if (originalData.TryGetValue("publisher", out tmp)) { convertedData.Add(new MetadataItem(MetadataType.PUBLISHER, tmp)); } // import format // e.g.: // Codec: XVID / MP3, 25fps, 320kb/s, 2 channels, 48000Hz, stereo // Codec: MP3, 320kb/s, 2 channels, 48000Hz, stereo string codec = null; string video = null; string audio = null; foreach (string key in new string[] { "video_codec", "audio_codec", "codec" }) { if (originalData.TryGetValue(key, out tmp)) { if (codec == null) codec = string.Format("Codec: {0}", tmp); else codec += " / " + tmp; } } if (originalData.TryGetValue("vidoe_fps", out tmp)) { video = tmp + "fps"; } string[][] keys = new string[][] { new string[] { "bitrate", "Kb/s"}, new string[] { "audio_channels", " channels"}, new string[] { "audio_samplerate", "Hz" }, new string[] { "mode", "" } }; foreach (string[] key in keys) { if (originalData.TryGetValue(key[0], out tmp)) { string val = tmp + key[1]; if (audio == null) audio = val; else audio += ", " + val; } } string format = null; foreach (string i in new string[] { codec, video, audio }) { if (i != null) { if (format == null) format = i; else format += ", " + i; } } if (format != null) { convertedData.Add(new MetadataItem(MetadataType.FORMAT, format)); } if (convertedData.Count == 0) return MetadataStore.Empty; else return new MetadataStore(convertedData); } } } VolumeDB/src/Import/AbstractImport.cs0000664000175000017500000002400312067326706017747 0ustar patrickpatrick// AbstractImport.cs // // Copyright (C) 2010, 2012 Patrick Ulbrich // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // using System; using System.IO; using System.Collections.Generic; using System.Threading; using System.ComponentModel; using Platform.Common.Diagnostics; namespace VolumeDB.Import { public abstract class AbstractImport : IImport { private List volumeDataPaths; private string sourceDbPath; private VolumeDatabase targetDb; private string dbDataPath; private int bufferSize; private volatile bool isRunning; private volatile bool importSucceeded; private volatile bool cancellationRequested; private double lastCompleted; private AsyncOperation asyncOperation; internal AbstractImport (string sourceDbPath, VolumeDatabase targetDb, string dbDataPath, int bufferSize) { if (sourceDbPath == null) throw new ArgumentNullException("sourceDbPath"); if (targetDb == null) throw new ArgumentNullException("targetDb"); if (dbDataPath == null) throw new ArgumentNullException("dbDataPath"); this.volumeDataPaths = new List(); this.sourceDbPath = sourceDbPath; this.targetDb = targetDb; this.dbDataPath = dbDataPath; this.bufferSize = bufferSize; this.isRunning = false; this.importSucceeded = false; this.cancellationRequested = false; } public static string[] GetSupportedExtensions() { var lst = new List(); foreach (var t in GetImportTypes()) { var attrs = t.GetCustomAttributes(false); foreach(var a in attrs) { var ia = a as ImportAttribute; if (ia != null) lst.Add(ia.Extension); } } return lst.ToArray(); } public static IImport GetImportByExtension(string extension, string sourceDbPath, VolumeDatabase targetDb, string dbDataPath, int bufferSize) { if (extension == null) throw new ArgumentNullException("extension"); foreach (var t in GetImportTypes()) { var attrs = t.GetCustomAttributes(false); foreach(var a in attrs) { var ia = a as ImportAttribute; if ((ia != null) && (ia.Extension.ToUpper() == extension.ToUpper())) { return (IImport)Activator.CreateInstance(t, new object[] { sourceDbPath, targetDb, dbDataPath, bufferSize }); } } } return null; } private static Type[] importTypes = null; private static Type[] GetImportTypes() { if (importTypes == null) { var lst = new List(); Type[] types = typeof(AbstractImport).Assembly.GetTypes(); foreach (var t in types) { if (t.IsSubclassOf(typeof(AbstractImport))) { lst.Add(t); } } importTypes = lst.ToArray(); } return importTypes; } public WaitHandle RunAsync() { if (isRunning) throw new InvalidOperationException("Import is already running"); try { /* must be set (as soon as possible) in a function that is _not_ called asynchronously * (i.e. dont call it in ImportThread()) */ isRunning = true; importSucceeded = false; cancellationRequested = false; asyncOperation = AsyncOperationManager.CreateOperation(null); Reset(); /* invoke the import function on a new thread and return a waithandle */ Action it = ImportThread; IAsyncResult ar = it.BeginInvoke(sourceDbPath, targetDb, dbDataPath, bufferSize, null, null); return ar.AsyncWaitHandle; } catch (Exception) { isRunning = false; if (asyncOperation != null) asyncOperation.OperationCompleted(); throw; } } public void CancelAsync() { cancellationRequested = true; } public bool IsBusy { get { return isRunning; } } public bool ImportSucceeded { get { return importSucceeded; } } public string Name { get { object[] attrs = this.GetType().GetCustomAttributes(false); foreach (var a in attrs) { var ia = a as ImportAttribute; if (ia != null) return ia.Name; } return ToString(); } } #region Events public event ErrorEventHandler Error; public event ImportCompletedEventHandler ImportCompleted; public event ProgressUpdateEventHandler ProgressUpdate; #endregion protected void CheckForCancellationRequest() { if (cancellationRequested) throw new ImportCancelledException(); } protected virtual void Reset() { lastCompleted = .0; volumeDataPaths.Clear(); } // TODO : make this member internally protected in case this language feature has become real // see http://lab.msdn.microsoft.com/productfeedback/viewfeedback.aspx?feedbackid=33c53cf6-2709-4cc9-a408-6cafee4313ef //protected internal abstract void ImportThreadMain(string sourceDbPath, VolumeDatabase targetDb, string dbDataPath, BufferedVolumeItemWriter writer); private void ImportThread(string sourceDbPath, VolumeDatabase targetDb, string dbDataPath, int buferSize) { Exception fatalError = null; bool cancelled = false; try { // must be the first call within the try block targetDb.TransactionBegin(); // locks VolumeDatabase if (!File.Exists(sourceDbPath)) throw new FileNotFoundException("Source database not found"); // note: // don't use the writer in a using() block here as dispose() would write // buffered items after an exception has been thrown. BufferedVolumeItemWriter writer = new BufferedVolumeItemWriter(targetDb, true, bufferSize); ImportThreadMain(sourceDbPath, targetDb, dbDataPath, writer); writer.Close(); targetDb.TransactionCommit(); // unlocks VolumeDatabase importSucceeded = true; } catch (Exception ex) { Exception cleanupException = null; try { targetDb.TransactionRollback(); // unlocks VolumeDatabase foreach (string path in volumeDataPaths) Directory.Delete(path, true); } catch (Exception e) { cleanupException = e; } if (ex is ImportCancelledException) { cancelled = true; } else { /* save the error that caused the import to stop (import failure) */ fatalError = ex; PostError(ex); Debug.WriteLine("Details for exception in ImportThread():\n" + ex.ToString()); } // in case an error occured while cleaning up, // post the error here, _after_ the initial error that made the import fail. if (cleanupException != null) { PostError(cleanupException); } //#if THROW_EXCEPTIONS_ON_ALL_THREADS // if (!(ex is ScanCancelledException)) // throw; //#endif } finally { isRunning = false; PostCompleted(fatalError, cancelled); } } protected string CreateThumbsDir(string dbDataPath, long volumeID) { string volumeDataPath = DbData.CreateVolumeDataPath(dbDataPath, volumeID); volumeDataPaths.Add(volumeDataPath); return DbData.CreateVolumeDataThumbsPath(volumeDataPath); } protected static void ImportThumb(long sourceID, long targetID, string sourceThumbsPath, string targetThumbsPath) { string sourceThumb = Path.Combine(sourceThumbsPath, sourceID.ToString() + ".png"); string targetThumb = Path.Combine(targetThumbsPath, targetID.ToString() + ".png"); if (File.Exists(sourceThumb)) File.Copy(sourceThumb, targetThumb); } protected void PostProgressUpdate(double completed) { // update progress on every full percent point only // to save resources and cpu if (((int)completed - (int)lastCompleted) < 1) return; lastCompleted = completed; SendOrPostCallback cb = delegate(object args) { OnProgressUpdate((ProgressUpdateEventArgs)args); }; ProgressUpdateEventArgs e = new ProgressUpdateEventArgs(completed); asyncOperation.Post(cb, e); } /// /// Called when an unhandled exception occurs. /// private void PostError(Exception ex) { SendOrPostCallback cb = delegate(object args) { OnError((VolumeDB.Import.ErrorEventArgs)args); }; ErrorEventArgs e = new ErrorEventArgs(ex); asyncOperation.Post(cb, e); } /// /// Called when importing has been completed. /// private void PostCompleted(Exception error, bool cancelled) { SendOrPostCallback cb = delegate(object args) { OnImportCompleted((ImportCompletedEventArgs)args); }; ImportCompletedEventArgs e = new ImportCompletedEventArgs(error, cancelled); asyncOperation.PostOperationCompleted(cb, e); } private void OnProgressUpdate(ProgressUpdateEventArgs e) { if (this.ProgressUpdate != null) this.ProgressUpdate(this, e); } private void OnError(ErrorEventArgs e) { if (this.Error != null) this.Error(this, e); } private void OnImportCompleted(ImportCompletedEventArgs e) { if (this.ImportCompleted != null) this.ImportCompleted(this, e); } /// /// Signals that the import has been cancelled. /// protected class ImportCancelledException : Exception { public ImportCancelledException() : base() { } } } } VolumeDB/src/Import/CdCollectImport.cs0000664000175000017500000000261712067326706020047 0ustar patrickpatrick// CdCollectImport.cs // // Copyright (C) 2010, 2012 Patrick Ulbrich // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // using System; namespace VolumeDB.Import { /* [Import("CdCollect", "db")] public sealed class CdCollectImport : AbstractImport { public CdCollectImport(string sourceDbPath, VolumeDatabase targetDb, string dbDataPath, int bufferSize) : base(sourceDbPath, targetDb, dbDataPath, bufferSize) {} internal override void ImportThreadMain(string sourceDbPath, VolumeDatabase targetDb, string dbDataPath, BufferedVolumeItemWriter writer) { throw new NotImplementedException(); } } */ } VolumeDB/src/Import/CdCatImport.cs0000664000175000017500000004414012067326706017166 0ustar patrickpatrick// CdCatImport.cs // // Copyright (C) 2012 Patrick Ulbrich // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // using System; using System.IO; using System.IO.Compression; using System.Collections.Generic; using System.Text; using System.Text.RegularExpressions; using System.Xml; using System.Globalization; using System.Linq; using Platform.Common.Mime; using Platform.Common.Diagnostics; using VolumeDB; using VolumeDB.Metadata; namespace VolumeDB.Import { [Import("CdCat", "hcf")] public sealed class CdCatImport : AbstractImport { public const float MAX_SUPPORTED_VERSION = 2.1f; private const string DATETIME_FORMAT = "yyyy-MM-dd HH:mm:ss"; private const int TOTAL_FILES = 0; private const int TOTAL_DIRS = 1; private const int TOTAL_SIZE = 2; private long[] counters; private long idCounter; private int mediaCounter; private int totalMedia; private Stack path; private string mimePathPrefix; private CultureInfo ci = CultureInfo.InvariantCulture; private VolumeDatabase targetDb; private BufferedVolumeItemWriter writer; public CdCatImport(string sourceDbPath, VolumeDatabase targetDb, string dbDataPath, int bufferSize) : base(sourceDbPath, targetDb, dbDataPath, bufferSize) {} private Dictionary driveTypeMapping = new Dictionary() { { "CD", VolumeDriveType.CDRom }, { "DVD", VolumeDriveType.CDRom }, { "HardDisc", VolumeDriveType.Harddisk }, { "NetworkPlace", VolumeDriveType.Network }, { "floppy", VolumeDriveType.Removable }, { "flashdrive", VolumeDriveType.Removable }, { "other", VolumeDriveType.Removable } }; private Dictionary metadataMapping = new Dictionary() { { "album", MetadataType.ALBUM }, { "title", MetadataType.TITLE }, { "artist", MetadataType.ARTIST }, { "year", MetadataType.YEAR } }; internal override void ImportThreadMain(string sourceDbPath, VolumeDatabase targetDb, string dbDataPath, BufferedVolumeItemWriter writer) { this.counters = new long[3]; //idCounter = 2; // id 1 is the root item //totalMedia = 0; this.path = new Stack(); this.mimePathPrefix = GetNonExistingPath() + "/"; this.targetDb = targetDb; this.writer = writer; using (GZipStream s = new GZipStream(File.OpenRead(sourceDbPath), CompressionMode.Decompress)) { XmlReaderSettings settings = new XmlReaderSettings() { DtdProcessing = DtdProcessing.Ignore, ValidationType = ValidationType.None, CheckCharacters = false }; XmlReader reader = XmlTextReader.Create(s, settings); XmlDocument xml = new XmlDocument(); xml.Load(reader); string dummy1 = null; MetadataStore dummy2 = MetadataStore.Empty; RecursiveDump(xml.DocumentElement, 0L, 0L, ref dummy1, ref dummy1, ref dummy2); } } private void RecursiveDump(XmlNode node, long volumeID, long parentID, ref string comment, ref string borrow, ref MetadataStore metadata) { long dirID = 0L; string b = null, c = null; MetadataStore md = MetadataStore.Empty; CheckForCancellationRequest(); switch (node.Name) { case "catalog": mediaCounter = 0; totalMedia = GetMediaCount(node); break; case "media": volumeID = targetDb.GetNextVolumeID(); dirID = 1L; // root item idCounter = 2L; // id 1 is the root item //path.Clear(); for (int i = 0; i < counters.Length; i++) counters[i] = 0L; break; case "directory": dirID = idCounter++; path.Push(node.Attributes["name"].Value); break; } foreach (XmlNode n in node) RecursiveDump(n, volumeID, dirID, ref c, ref b, ref md); switch (node.Name) { case "media": ImportMedia(node, b, c, volumeID); PostProgressUpdate((++mediaCounter * 100.0) / totalMedia); break; case "directory": path.Pop(); ImportFile(node, c, volumeID, parentID, dirID, path, /* ignore weird CdCat directory metadata */ MetadataStore.Empty); break; case "file": ImportFile(node, c, volumeID, parentID, idCounter++, path, md); break; case "comment": if (!ConvertMetaData(node, ref metadata)) comment = node.InnerText.Trim(); break; case "borrow": borrow = node.InnerText.Trim(); break; case "mp3tag": ConvertMetaData(node, ref metadata); break; case "datafile": if (float.Parse(node.Attributes["version"].Value, ci.NumberFormat) > MAX_SUPPORTED_VERSION) throw new ImportException("Unsupported catalog version"); break; } } private void ImportMedia(XmlNode node, string borrow, string comment, long volumeID) { FileSystemVolume v = new FileSystemVolume(targetDb); VolumeDriveType driveType = driveTypeMapping[node.Attributes["type"].Value]; DateTime added; if (!DateTime.TryParseExact(node.Attributes["time"].Value, DATETIME_FORMAT, ci.DateTimeFormat, DateTimeStyles.None, out added)) added = DateTime.MinValue; v.SetVolumeFields(volumeID, node.Attributes["name"].Value, added, false, node.Attributes["number"].Value, driveType, borrow, DateTime.MinValue, DateTime.MinValue, null, comment, null); v.SetFileSystemVolumeFields(counters[TOTAL_FILES], counters[TOTAL_DIRS], counters[TOTAL_SIZE]); v.InsertIntoDB(); // insert root item DirectoryVolumeItem item = new DirectoryVolumeItem(targetDb); item.SetFileSystemVolumeItemFields(null, DateTime.MinValue, VolumeDatabase.ID_NONE); item.SetVolumeItemFields(volumeID, 1L, 0L, "/", VolumeScanner.FilesystemVolumeScanner.MIME_TYPE_DIRECTORY, MetadataStore.Empty, null, null); item.InsertIntoDB(); } private void ImportFile(XmlNode node, string comment, long volumeID, long parentID, long itemID, Stack path, MetadataStore metaData) { FileSystemVolumeItem item; string location = "/" + string.Join("/", path.Reverse()); string name = node.Attributes["name"].Value; string mimeType; DateTime lastWriteTime; if (node.Name == "directory") { item = new DirectoryVolumeItem(targetDb); mimeType = VolumeScanner.FilesystemVolumeScanner.MIME_TYPE_DIRECTORY; counters[TOTAL_DIRS]++; } else { item = new FileVolumeItem(targetDb); // prepend a non-existing path to ensure the file doesn't actually exist // in the current environment directory mimeType = MimeType.GetMimeTypeForFile(mimePathPrefix + name); long size = ConvertSize(node.Attributes["size"].Value); ((FileVolumeItem)item).SetFileVolumeItemFields(size, null); counters[TOTAL_FILES]++; counters[TOTAL_SIZE] += size; } if (!DateTime.TryParseExact(node.Attributes["time"].Value, DATETIME_FORMAT, ci.DateTimeFormat, DateTimeStyles.None, out lastWriteTime)) lastWriteTime = DateTime.MinValue; item.SetFileSystemVolumeItemFields(location, lastWriteTime, VolumeDatabase.ID_NONE); item.SetVolumeItemFields(volumeID, itemID, parentID, name, mimeType, metaData, comment, null); writer.Write(item); } private static long ConvertSize(string size) { string[] pair = size.Split(' '); double sz = double.Parse(pair[0]); switch (pair[1]) { case "byte": break; case "Kb": sz*= 1024.0; break; case "Mb": sz*= (1024.0 * 1024.0); break; case "Gb": sz*= (1024.0 * 1024.0 * 1024.0); break; case "Tb": sz*= (1024.0 * 1024.0 * 1024.0 * 1024.0); break; } return (long)sz; } private bool ConvertMetaData(XmlNode node, ref MetadataStore metadata) { List convertedData; StringSplitOptions opts = StringSplitOptions.RemoveEmptyEntries; Debug.Assert((node.Name == "mp3tag") || (node.Name == "comment"), string.Format("Expected 'mp3tag' or 'comment' node but got '{0}' node", node.Name)); try { string tmp; switch (node.Name) { case "mp3tag": convertedData = new List(); foreach (var pair in metadataMapping) { tmp = node.Attributes[pair.Key].Value.Trim(); if (tmp.Length > 0) convertedData.Add(new MetadataItem(pair.Value, tmp)); } string comment = node.InnerText.Trim(); if (comment.Length > 0) convertedData.Add(new MetadataItem(MetadataType.COMMENT, comment)); if (convertedData.Count > 0) metadata = new MetadataStore(convertedData); break; case "comment": string match; tmp = node.InnerText.Trim(); // try to parse Video/Audio info from comments, // e. g. "Video:#XVID MPEG-4#Gesamtzeit = 1:16:09#Framerate = 23.976 f/s#Aufloesung = 640x272##Audio:#ISO/MPEG Layer-3 // #Kanaele = 2 #Sample/s = 48.0kHz #Bitrate = 123 kBit" if (tmp.StartsWith("Video:#")) { convertedData = new List(); string[] streams = tmp.Split(new string[] { "##" }, opts); // // parse video info // string videoFormat = null; string framerate = null; if (Match(streams[0], @"([\d\.]+) f/s", out match)) { // framerate float fps; if (float.TryParse(match, NumberStyles.AllowDecimalPoint, ci.NumberFormat, out fps)) framerate = string.Format(ci.NumberFormat, "{0:F2} fps", fps); } if (Match(streams[0], @"^Video:#([#/\w\.\-\+\(\)\$\s]+)#", out match)) { // videoformat videoFormat = match; if (framerate != null) videoFormat += ", " + framerate; } if (Match(streams[0], @"(\d+:\d+:\d+)", out match)) { // duration TimeSpan duration = TimeSpan.Parse(match); convertedData.Add(new MetadataItem(MetadataType.DURATION, MetadataUtils.SecsToMetadataDuration(duration.TotalSeconds))); } if (Match(streams[0], @"(\d+x\d+)", out match)) { // size (NxM) convertedData.Add(new MetadataItem(MetadataType.SIZE, match)); } if (videoFormat != null) { string format; // // audio stream info available? // if ((streams.Length > 1) && (streams[1].StartsWith("Audio:#"))) { string audioFormat; List fmt = new List(); if (Match(streams[1], @"([\w\.\s]+)kHz", out match)) { // frequency int freq = ((int)float.Parse(match, ci.NumberFormat)) * 1000; fmt.Add(freq.ToString() + " Hz"); } if (Match(streams[1], @"(\d+) kBit", out match)) { // bitrate fmt.Add(match + " kb/s"); } if (Match(streams[1], @"^Audio:#([#/\w\.\-\+\(\)\$\s]+)#", out match)) { // audioformat audioFormat = match; if (fmt.Count > 0) audioFormat += ", " + string.Join(", ", fmt); format = string.Format("Video: {0}; Audio: {1}", videoFormat, audioFormat); } else { format = videoFormat; } } else { format = videoFormat; } convertedData.Add(new MetadataItem(MetadataType.FORMAT, format)); } if (convertedData.Count > 0) metadata = new MetadataStore(convertedData); // try to parse audio only info // e. g. "0:7, 192 kbps#44100Hz, Simple stereo" // (try to parse duration only) } else if (Match(tmp, @"^(\d+:\d{1,2}), \d+ kbps", out match)) { // don't use DateTime.ParseExact() since minutes may be > 59 string[] time = match.Split(new char[] { ':' }, opts); int mins = int.Parse(time[0]); int secs = int.Parse(time[1]); double duration = (mins * 60.0) + secs; metadata = new MetadataStore(new MetadataItem[] { new MetadataItem(MetadataType.DURATION, MetadataUtils.SecsToMetadataDuration(duration)) }); // try to parse audio only info // e. g. "VBR,44100Hz#Joint stereo" (didn't encounter ABR or CBR yet) } else if (Regex.IsMatch(tmp, @"^(VBR|ABR|CBR){1},\d+Hz")) { // ignored // "Encoder: Lavf52.77.0 // Video tracks: // Track 1: , 640x480 @ 25.0 fps, 1:59:23.5 // Audio tracks: // Track 2: MPEG-4 (AAC), 128 kbps, 44100 Hz, Channels: 2, 1:59:23.5" } else if (Regex.IsMatch(tmp, @"Video tracks:\nTrack \d+:")) { convertedData = new List(); if (Match(tmp, @"(\d+x\d+)", out match)) { // size (NxM) convertedData.Add(new MetadataItem(MetadataType.SIZE, match)); } if (Match(tmp, @"(\d+:\d+:\d+)", out match)) { TimeSpan duration = TimeSpan.Parse(match); convertedData.Add(new MetadataItem(MetadataType.DURATION, MetadataUtils.SecsToMetadataDuration(duration.TotalSeconds))); } else if (Match(tmp, @"(\d+:\d+) min", out match)) { string[] time = match.Split(new char[] { ':' }, opts); int mins = int.Parse(time[0]); int secs = int.Parse(time[1]); double duration = (mins * 60.0) + secs; convertedData.Add(new MetadataItem(MetadataType.DURATION, MetadataUtils.SecsToMetadataDuration(duration))); } if (convertedData.Count > 0) metadata = new MetadataStore(convertedData); // "foo text // Windows Media Audio 9 // 32 kbps, 32 kHz, stereo (A/V) 1-pass CBR" } else if (Regex.IsMatch(tmp, @"Windows Media Audio \d+( Professional)?\n\d+ kbps")) { // ignored, audio only info for a wmv file // "640 x 340, 25,000 fps, 765,8 kbit/s (2:19:29) // XviD MPEG-4 codec // MPEG-1 Layer 3 (MP3), 128,0 kbit/s, 48000 Hz, stereo // --- // Software: VirtualDubMod 1.5.10.2 (build 2542/release)" } else if (Match(tmp, @"^""(\d+ x \d+), \d+[,\.]{1}\d+ fps", out match)) { convertedData = new List(); convertedData.Add(new MetadataItem(MetadataType.SIZE, match.Replace(" ", ""))); if (Match(tmp, @"(\d+:\d+:\d+)", out match)) { TimeSpan duration = TimeSpan.Parse(match); convertedData.Add(new MetadataItem(MetadataType.DURATION, MetadataUtils.SecsToMetadataDuration(duration.TotalSeconds))); } metadata = new MetadataStore(convertedData); // try to parse image info, e.g.: // "751 x 500, 16.7 million colors (24 bit) // --- // Firmware Version: Adobe Photoshop CS3 Windows // 300 x 300 DPI" } else if (Match(tmp, @"^""?(\d+ x \d+), ([\w\.\s]+ colors|Black and White){1}", out match)) { metadata = new MetadataStore(new MetadataItem[] { new MetadataItem(MetadataType.SIZE, match.Replace(" ", "")) }); } else { return false; } break; default: return false; } // switch (node.Name) } catch (Exception ex) { Debug.WriteLine("Caught exception in ConvertMetaData():\n" + ex.ToString()); return false; } return true; } private static int GetMediaCount(XmlNode catalogNode) { Debug.Assert(catalogNode.Name == "catalog", string.Format("Expected 'catalog' node but got '{0}' node", catalogNode.Name)); int n = 0; foreach (XmlNode node in catalogNode.ChildNodes) { if (node.Name == "media") n++; } return n; } private static bool Match(string input, string pattern, out string output) { Regex regex = new Regex(pattern); Match match = regex.Match(input); if (match.Success) { output = match.Groups[1].Value; return true; } output = null; return false; } private static string GetNonExistingPath() { Random rand = new Random(); StringBuilder sb = new StringBuilder(); string path; do { for (int i = 0; i < 2; i++) { sb.Append((char)rand.Next(48, 57)); sb.Append((char)rand.Next(65, 90)); } path = sb.ToString(); } while (Directory.Exists(path)); return path; } } } VolumeDB/src/Import/ImportException.cs0000664000175000017500000000161612067326706020147 0ustar patrickpatrick// ImportException.cs // // Copyright (C) 2012 Patrick Ulbrich // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // using System; namespace VolumeDB.Import { public class ImportException : Exception { public ImportException() : base() { } public ImportException(string message) : base(message) { } } }VolumeDB/src/Import/IImport.cs0000664000175000017500000000207412067326706016400 0ustar patrickpatrick// IImport.cs // // Copyright (C) 2010, 2012 Patrick Ulbrich // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // using System; using System.Threading; namespace VolumeDB.Import { public interface IImport { WaitHandle RunAsync(); void CancelAsync(); bool IsBusy { get; } bool ImportSucceeded { get; } string Name { get; } event ErrorEventHandler Error; event ImportCompletedEventHandler ImportCompleted; event ProgressUpdateEventHandler ProgressUpdate; } } VolumeDB/src/Import/BasenjiImport.cs0000664000175000017500000000260212067326706017560 0ustar patrickpatrick// BasenjiImport.cs // // Copyright (C) 2010, 2012 Patrick Ulbrich // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // using System; namespace VolumeDB.Import { /* [Import("Basenji", "vdb")] public sealed class BasenjiImport : AbstractImport { public BasenjiImport(string sourceDbPath, VolumeDatabase targetDb, string dbDataPath, int bufferSize) : base(sourceDbPath, targetDb, dbDataPath, bufferSize) {} internal override void ImportThreadMain(string sourceDbPath, VolumeDatabase targetDb, string dbDataPath, BufferedVolumeItemWriter writer) { throw new NotImplementedException(); } } */ } VolumeDB/src/Import/ImportAttribute.cs0000664000175000017500000000201512067326706020146 0ustar patrickpatrick// ImportAttribute.cs // // Copyright (C) 2012 Patrick Ulbrich // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // using System; namespace VolumeDB { internal class ImportAttribute : Attribute { public ImportAttribute (string name, string extension) { this.Name = name; this.Extension = extension; } public string Name { get; private set; } public string Extension { get; private set; } } } VolumeDB/VolumeDB.mdp0000664000175000017500000003244212067326706014606 0ustar patrickpatrick